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

Redshift SQL:如何实现按cust_id分区并随variable列递增的rank

实现按分区内变量变化递增的排名方案

这是典型的分组内连续值变化排名需求,用窗口函数就能搞定,核心思路是先识别variable列的变化节点,再基于这些节点生成分组,最后对分组排名。

直接给你可复用的SQL逻辑(适配大多数支持窗口函数的数据库:MySQL 8+/PostgreSQL/SQL Server等):

WITH ranked_groups AS (
    SELECT
        cust_id,
        id,
        variable,
        -- 标记当前行与上一行variable是否不同,不同则记1
        CASE 
            WHEN LAG(variable) OVER (PARTITION BY cust_id ORDER BY id) != variable THEN 1
            ELSE 0
        END AS change_flag,
        -- 累计求和得到每个连续相同variable的组ID
        SUM(CASE 
            WHEN LAG(variable) OVER (PARTITION BY cust_id ORDER BY id) != variable THEN 1
            ELSE 0
        END) OVER (PARTITION BY cust_id ORDER BY id) + 1 AS group_id
    FROM your_table
)
SELECT
    cust_id,
    id,
    variable,
    -- 基于group_id生成最终排名
    DENSE_RANK() OVER (PARTITION BY cust_id ORDER BY group_id) AS desired_rank
FROM ranked_groups
ORDER BY cust_id, id;

逻辑拆解:

  1. 识别变化节点:用LAG(variable)获取当前行在cust_id分区内、按id排序的上一行variable值,和当前行对比,不同就标记为1(代表出现了变化)。
  2. 生成连续组ID:对change_flag做累计求和,这样每遇到一次变化,求和结果就会+1,同一个连续variable区间的行就会得到相同的group_id。加1是为了让排名从1开始,而不是0。
  3. 生成最终排名:用DENSE_RANK()按cust_id分区、group_id排序,这样每次variable变化时,排名就会递增1,完全符合你要的效果。

如果你的数据库支持默认的累计求和范围(大多数数据库默认就是ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),累计求和的部分可以简化写法,但上面的版本兼容性更强。

内容的提问来源于stack exchange,提问作者user3482471

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 00:33:23