sql - 获取最小日期记录并计算特定时间范围内的后续记录
问题描述
我有以下示例表:
用户 | 日期 |
---|---|
一个 | 2016-01-01 |
一个 | 2017-01-01 |
一个 | 2018-01-01 |
一个 | 2019-01-01 |
乙 | 2017-03-05 |
乙 | 2017-11-01 |
我正在努力实现以下目标:
- 为每个用户取最短(第一次)日期
- 在用户的最短日期之后的 2 年时间范围内计算每个用户的所有后续记录
以下是我想使用 PostgreSQL 实现的示例:
用户 | min_date | count_of_records_in_following_8_months |
---|---|---|
一个 | 2016-07-01 | 2 |
乙 | 2017-03-05 | 1 |
解决方案
使用窗口函数来获取最小日期。然后聚合:
select user,
count(*) filter (where date > min_date and date < min_date + interval '8 month')
from (select t.*, min(date) over (partition by user) as min_date
from t
) t
group by user;
这是一个 db<>fiddle。
注意: user
是保留字,因此不应用作列名。
推荐阅读
- reactjs - 将 React Memo 与 Flow 一起使用的正确方法是什么?
- jenkins - 如何从 git 存储库提供一个 groovy 脚本来设置扩展选择参数
- python - python库如何处理内部导入?
- python-3.x - 我的刮板不适用于 403 禁止的 google-compute-engine
- azure-active-directory - (iOS) 成功获取token,但应用第二次打开时无法从web API获取结果
- angular-routing -
在离子 4 中不起作用 - javascript - 为什么无法使用具有自动播放属性的 HTML 音频标签获得声音
- sql-server - 有什么方法可以跟踪谁在 MS SQL SERVER 2016 中禁用/启用了 SQL 代理作业
- latex - R Markdown pdf_document2 PDF图形和表格编号按部分
- sql - 获取第 8 位和数值之间的字符:Oracle