Найти самую последнюю строку для пользователя и дня в SQL-запросе - PullRequest
0 голосов
/ 30 января 2019

Я хочу найти самую последнюю покупку для каждого клиента для каждой даты (клиент может совершить несколько покупок в определенную дату, и я хочу получить самую последнюю покупку для этой даты).Мой фрейм данных выглядит примерно так:

Customer_id | Date                  | Payment  | Type
3             '2019-01-28 00:45:00'   128.93     Credit
2             '2019-01-26 01:00:00'    54.36     Debit
3             '2019-01-27 12:00:00'    93.99     Debit
3             '2019-01-28 03:15:00'   164.93     Credit
2             '2019-01-26 17:30:00'    56.74     Credit
2             '2019-01-28 19:15:00'    21.85     Credit

Вывод запроса должен дать мне что-то вроде следующего (я возвращаю одну строку для каждой комбинации клиент / дата и заказ по клиенту / дате.забота о типе - будь то кредит или дебет):

Customer_id | Date          | Payment
2             '2019-01-26'    56.74
2             '2019-01-28'    21.85
3             '2019-01-27'    93.99
3             '2019-01-28'   164.93

Вот мой код:

SELECT
    R1.Customer_id,
    date_trunc('day', R1.Date),
    R1.Payment
FROM Records R1
WHERE R1.Date = (SELECT MAX(R2.Date)
                 FROM Records R2
                 WHERE R2.Customer_id = R1.Customer_id)
GROUP BY Customer_id, date_trunc('day', R1.Date);

Приведенный мною пример упрощает данные, которыми я являюсьработа с некоторыми условиями фильтрации, но она должна охватывать основную проблему, с которой я сталкиваюсь.Не совсем уверен, что это на правильном пути, но мне кажется недовольным «Группировать по», когда я запускаю запрос.Я новичок в SQL и хотел бы помочь!

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Этот запрос:

select Customer_id, Date::date, max(Date) maxdate from tablename group by customer_id, Date::date

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

select t.Customer_id, t.date, tt.Payment from (
select Customer_id, Date::date date, max(Date) maxdate from tablename group by customer_id, Date::date
) t inner join tablename tt
on tt.customer_id = t.customer_id and tt.date = t.maxdate
0 голосов
/ 30 января 2019

В Postgres обычно лучше всего использовать distinct on:

select distinct on (customer_id, date::date) t.*
from t
order by customer_id, date desc;

В частности, это может использовать индекс на (customer_id, date desc).

.
...