首页 > 解决方案 > 从连续日期中查找最近的开始日期和结束日期

问题描述

我有一个如下表:

用户身份 store_id 股票 日期
116 2 0 2021-10-18
116 2 0 2021-10-19
116 2 0 2021-10-20
116 2 0 2021-08-16
116 2 0 2021-08-15
116 2 0 2021-07-04
116 2 0 ,2021-07-03
389 2 0 2021-07-02
389 2 0 2021-07-01
389 2 0 2021-10-27
52 6 0 2021-10-28
52 6 0 2021-10-29
52 6 0 2021-10-30
116 38 0 2021-05-02
116 38 0 2021-05-03
116 38 0 2021-05-04
116 38 0 2021-04-06

该表可以连续多天出现产品缺货的情况,因此我想使用产品缺货的最后一个 startDate 和 endDate 创建一个查询。对于上表,结果必须是:

用户身份 store_id 开始日期 结束日期
116 2 2021-10-18 2021-10-20
116 38 2021-05-02 2021-05-04
389 2 2021-07-01 2021-07-02
52 6 2021-10-28 2021-10-30

我已经尝试了使用 row_number() 的解决方案,但没有奏效。有人有用 SQL (PostgreSQL) 解决这个问题的提示或想法吗?

标签: sqlpostgresql

解决方案


这是你如何做到的:

select user_id, store_id,min(date) startdate,max(date) enddate
from (
   select *, rank() over (partition by user_id, store_id order by grp desc) rn from (
       select *, date - row_number() over (partition by user_id,store_id order by date) * interval '1 day' grp
       from tablename 
) t) t where rn = 1
group by user_id, store_id,grp

db<>在这里摆弄


推荐阅读