I have the following (table).
x
"customers_dishes"
id - customer id, STRING
date - date of arriving at the restaurant, DATE
bill - total bill, DOUBLE
I am trying to output all of the incidents of customers that their bill was greater than their first date visiting the restaurant bill
id, date, bill
Alen, 2018-03-01, 50
Alen, 2018-03-02, 48
Alen, 2019-03-01, 60
Bob, 2018-03-04, 45
Bob, 2018-03-06, 55
Bob, 2019-03-01, 50
the output should be:
id, date, bill
Alen, 2019-03-01, 60
Bob, 2018-03-06, 55
Bob, 2019-03-01, 50
Tried doing something like that:
SELECT (*) FROM customers_dishes
WHERE date NOT IN (
SELECT date FROM customers_dishes ORDER BY id, date ASC LIMIT 1)
AND id NOT IN(
SELECT id FROM customers_dishes ORDER BY id, date ASC LIMIT 1)
Any suggestions please?
Advertisement
Answer
You can use first_value()
:
select cd.*
from (select cd.*,
first_value(bill) over (partition by id order by date) as first_bill
from customers_dishes cd
) cd
where bill > first_bill;
You can also use a correlated subquery:
select cd.*
from customers_dishes cd
where cd.bill > (select cd2.bill
from customers_dishes cd2
where cd2.id = cd.id
order cd2.date
fetch first 1 row only
);