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;
逻辑拆解:
- 识别变化节点:用
LAG(variable)获取当前行在cust_id分区内、按id排序的上一行variable值,和当前行对比,不同就标记为1(代表出现了变化)。 - 生成连续组ID:对
change_flag做累计求和,这样每遇到一次变化,求和结果就会+1,同一个连续variable区间的行就会得到相同的group_id。加1是为了让排名从1开始,而不是0。 - 生成最终排名:用
DENSE_RANK()按cust_id分区、group_id排序,这样每次variable变化时,排名就会递增1,完全符合你要的效果。
如果你的数据库支持默认的累计求和范围(大多数数据库默认就是ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),累计求和的部分可以简化写法,但上面的版本兼容性更强。
内容的提问来源于stack exchange,提问作者user3482471
相关产品推荐
相关产品推荐

