SQL轮转分组模式下dense_rank实现:门店连续营业状态分组编号
解决方案
这个是经典的缝隙分组(gaps and islands)场景,你之前的用法有偏差,不要把is_open放到PARTITION BY子句中,仅按store分区即可,排序子句固定按date升序保证时间顺序。
实现逻辑
- 第一步:用
LAG()窗口函数取同门店上一条记录的is_open值,和当前行对比,标记状态是否发生变化 - 第二步:用
SUM()窗口函数累加变化标记,每出现一次变化累加值加1,连续相同状态的记录累加值一致,即为分组编号
示例代码
假设你的表名为store_daily_status,完整SQL如下:
SELECT store, date, is_open, SUM(change_flag) OVER (PARTITION BY store ORDER BY date) AS `group` FROM ( SELECT store, date, is_open, CASE WHEN is_open = LAG(is_open, 1) OVER (PARTITION BY store ORDER BY date) THEN 0 ELSE 1 END AS change_flag FROM store_daily_status ) t
逻辑说明
- 内层子查询的
LAG函数会按门店分组、按日期排序,取当前行的前一行is_open值,若和当前值一致则标记为0,不一致(包括首行无前置记录的场景)则标记为1 - 外层的
SUM窗口函数同样按门店分组、按日期排序累加标记值,连续相同状态的记录对应的标记都是0,累加值不会发生变化,状态变化时标记为1,累加值加1,刚好实现需求中的分组规则。
内容的提问来源于stack exchange,提问作者Muhammad Raihan Muhaimin
相关产品推荐
相关产品推荐

