sql - 从连续日期中查找最近的开始日期和结束日期
问题描述
我有一个如下表:
用户身份 | 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) 解决这个问题的提示或想法吗?
解决方案
这是你如何做到的:
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<>在这里摆弄
推荐阅读
- reactjs - 防止来自内部重定向的预检请求
- sql - 获取 emolyee 的首要功能
- cqrs - 了解 CQRS 和 EventSourcing
- ios - 来自 xcode 11 的静态库在 xcode10 中不可接受是否正确
- java - 为什么我要多次获取数据?
- ruby-on-rails - Rails gem cancancan 不同可以吗?并授权
- javascript - 将数据发布到站点并将其加载到 iframe 中的另一个站点(角度和 c#)
- bash - Ansible:执行命令输出,进入另一个命令
- reactjs - 我如何通过功能组件在对象的多维数组中设置状态
- ios - 卸载assetbundle场景时Unity iOS崩溃