sql - 计算 SQL 中连续日期的事件运行计数
问题描述
我有数据可以总结如下:
eventid startdate enddate productkey date startGroup endGroup eventGroup
123 2020-01-01 2020-01-10 123456 2020-01-01 1 0 1
123 2020-01-01 2020-01-10 123456 2020-01-02 0 0 1
123 2020-01-01 2020-01-10 123456 2020-01-03 0 0 1
123 2020-01-01 2020-01-10 123456 2020-01-04 0 1 1
234 2020-01-05 2020-01-07 123456 2020-01-05 1 0 2
234 2020-01-05 2020-01-07 123456 2020-01-06 0 0 2
234 2020-01-05 2020-01-07 123456 2020-01-07 0 1 2
123 2020-01-01 2020-01-10 123456 2020-01-08 1 0 1
123 2020-01-01 2020-01-10 123456 2020-01-09 0 0 1
123 2020-01-01 2020-01-10 123456 2020-01-10 0 1 1
为商品收藏各种各样的活动。由于它们可能重叠,我已经有代码去重复数据,但是现在,由于缺少一些(去重复)天,我需要在事件级别将数据重新组合在一起。在示例数据中,您会看到两个事件,123(从 1/1 运行到 1/10)和 234(从 1/5 运行到 1/7)。我已经剪掉了中间两天以消除重叠,我想要输出的是三组事件
- 1/1-1/4(即最后一列 = 1)
- 1/5-1/7(即最后一列 = 2)
- 1/8-1/10(即最后一列 = 3)
我已经有代码可以为每个时间块找到正确的开始和结束条目,但不知道如何正确计算 eventGroup 列。最后三列的当前代码如下:
CASE WHEN DATEADD(DAY, -1, date) = LAG(date) OVER (PARTITION BY eventid, productkey ORDER BY date) THEN 0 ELSE 1 END startGroup,
CASE WHEN DATEADD(DAY, +1, date) = LEAD(date) OVER (PARTITION BY eventid, productkey ORDER BY date) THEN 0 ELSE 1 END endGroup,
dense_rank() over (order by eventid, productkey) eventGroup
我已经尝试过https://dba.stackexchange.com/questions/193680/group-rows-by-uninterrupted-dates之类的方法,但仍然无法创建正确的组。
在 Excel 逻辑中,它是 eventGroup = if ( startGroup = 0,前一行的 eventGroup,前一行的 eventGroup + 1),但不确定如何在此处复制该运行计数器。
有人可以帮忙吗?谢谢!
解决方案
要分配组,请使用累积总和:
select t.*,
sum(startGroup) over (partition by eventId, productKey order by startdate)
from t;
注意:这假设您要使用事件/产品组合重新开始编号。
推荐阅读
- javascript - 静态网站翻译问题
- java - Java:简单的客户端服务器消息交换不起作用
- ruby - 将设计模式与模块一起使用
- r - 我需要通过 R 检查数据输入...我如何验证它的格式是否正确
- file - 查找和替换文件中的一行
- prestashop-1.7 - 如何在 Prestashop 1.7 中创建产品
- java - getLastKnowLocation 返回 null
- node.js - Passport-ldapauth - 未经授权的消息
- objective-c - 为什么 self=[super init] 确保单例模式?
- vue.js - 以编程方式将 v-on 指令添加到 DOM 元素