You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 22:24:03