在 sql 查询中查找每个用户和日期的最新行

Find most recent row per user and day in sql query

我想查找每个客户在每个日期的最新购买(客户可能在给定日期进行多次购买,而我想要该日期的最新购买)。我的数据框如下所示:

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

查询的输出应该像下面这样(我 return 每个 customer/date 组合一行并按 customer/date 排序。我不关心类型- 无论是贷方还是借方):

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);

我给出的例子是对我正在处理的数据和一些过滤条件的简化,但应该能捕捉到我面临的主要问题。不太确定这是否在正确的轨道上,但当我 运行 查询时,它似乎对 'Group by' 不满意。我是 sql 的新手,希望得到帮助!

在 Postgres 中,distinct on 通常是最好的方法:

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

特别是,这可以利用 (customer_id, date desc) 上的索引。

这个查询:

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

获取每个客户的最近日期。
将其加入主 table 以获取包含每个客户的最新日期的行:

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