sql - 是否可以计算不同月份具有相同 ID 的项目数(例如跨聚合月份的交叉点)?
问题描述
我很难说出我的问题。我想按月分组,然后每个月,找出 N 和 N-1 个月之间有多少帐户是相同的。所以,具体来说,我不是在比较聚合(如总计数),我想以某种方式计算intersect
月份之间的值。
例如,这张表:
date id
2020-01-01 123
2020-01-01 234
2020-01-01 345
2020-02-01 123
2020-02-01 345
2020-03-01 123
2020-03-01 456
我正在尝试产生如下结果:
date total same
2020-01-01 3 null -- no previous month with which to compare
2020-02-01 2 2
2020-03-01 2 1
这可能吗?
解决方案
使用lag()
和条件聚合:
select date_trunc('month', date) as yyyymm, count(*) as total,
count(*) filter (where date_trunc('month', date) = date_trunc('month', prev_date) as same_as_prev_month
from (select t.*,
lag(date) over (partition by id) as prev_date
from t
) t
group by yyyymm
order by yyyymm;
注意:这假设 id 每月最多有一行。如果行可以重复,请使用count(distinct)
:
select date_trunc('month', date) as yyyymm,
count(distinct id) as total,
count(distinct id) filter (where date_trunc('month', date) = date_trunc('month', prev_date) as same_as_prev_month
推荐阅读
- node.js - Symfony 5.2 + Webpack Encore:npm 运行显示错误“意外令牌”
- maven - 通过 maven-invoker-plugin 运行构建后脚本
- repeat - 如何复制粘贴很多很快(img01,img02,img03,...)不同的html?
- maven - 有没有办法根据构建期间创建的文件激活配置文件?
- node.js - 在 nest.js 中设置请求标头大小限制
- javascript - 当在单个输入上调用 onChange 时,React 输入元素都会重新渲染,即使输入上有 memo 并且 onChange 上有 useCallback
- visual-studio - 应用服务高级 P1v3 级别在 Visual Studio 中不可用
- logstash - sincedb_path 应该在 Logstash 中的什么文件?有什么例子吗?
- exception - 当处理器抛出未捕获的异常时,Kafka 流应用程序关闭?
- excel - 我可以打开一个特定的工作表来修复损坏的文件吗