#sql #postgresql
#sql #postgresql
Вопрос:
У меня есть таблица платежей, и то, что я хочу сделать, это получить все платежи, которые на момент платежа были самым крупным платежом на сегодняшний день.
У меня следующий запрос:
SELECT MAX(t.amount), t.date
FROM (
SELECT MAX(pay.amount) AS amount, DATE(pay.payment_date)
FROM payment pay
JOIN payment pay2 ON pay2.payment_id = pay.payment_id
WHERE pay2.payment_date <= pay.payment_date
GROUP BY DATE(pay.payment_date), pay.amount
ORDER BY DATE(pay.payment_date)
) t
GROUP BY t.date;
Который возвращает следующий вывод:
| amount | date |
|--------|------------|
| 10.99 | 2007-02-21 |
| 10.99 | 2007-03-01 |
| 11.99 | 2007-03-02 |
| 10.99 | 2007-03-16 |
| 10.99 | 2007-03-17 |
То, что он должен выводить, составляет 11,99 для всего, что после 2007-03-02
Я не уверен, где ловушка в моей логике, поэтому любая помощь очень ценится. Еще более важно, если вы можете помочь мне выяснить, как получить все детали платежа, а не только дату и сумму.
Ответ №1:
Похоже, это сработало с некоторыми тестовыми данными, но попробуйте и посмотрите. Он использует аналитическую функцию max:
with cte1 as (
SELECT MAX(pay.amount) AS amount, DATE(pay.payment_date)
FROM payment pay
JOIN payment pay2 ON pay2.payment_id = pay.payment_id
WHERE pay2.payment_date <= pay.payment_date
GROUP BY DATE(pay.payment_date), pay.amount
),
cte2 as (
SELECT MAX(t.amount) as amount, t.date
from cte1
GROUP BY t.date
)
select
amount, date,
max (amount) over (order by date)
from cte2
Комментарии:
1. Потрясающе, некоторые небольшие корректировки дали мне идеальный ответ. Спасибо!