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