Перечислить все платежи, которые на момент платежа были самым крупным платежом на сегодняшний день

#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. Потрясающе, некоторые небольшие корректировки дали мне идеальный ответ. Спасибо!