如何通过SQL计算分组内排名的波动,用前后行差值来分析?
- 内容介绍
- 相关推荐
本文共计884个文字,预计阅读时间需要4分钟。
直接说明结论:
常见错误是先用子查询算出每组每条记录的当前排名,再试图用外部查询连表比对——这不仅慢,还容易因排序不稳定导致前后行错位。
-
ROW_NUMBER() OVER (PARTITION BY group_col ORDER BY score DESC)给每组按得分排当前名次(1 是最高) -
LAG(rn, 1) OVER (PARTITION BY group_col ORDER BY time_col)按时间顺序取上一次的排名值,注意:ORDER BY 必须是时间维度,不是分数维度 - 两列相减即得“比上次上升/下降几名”,结果为正表示退步(数字变大),负表示进步
为什么 ORDER BY 在 LAG 和 ROW_NUMBER 中要不同?
这是最容易翻车的地方。
本文共计884个文字,预计阅读时间需要4分钟。
直接说明结论:
常见错误是先用子查询算出每组每条记录的当前排名,再试图用外部查询连表比对——这不仅慢,还容易因排序不稳定导致前后行错位。
-
ROW_NUMBER() OVER (PARTITION BY group_col ORDER BY score DESC)给每组按得分排当前名次(1 是最高) -
LAG(rn, 1) OVER (PARTITION BY group_col ORDER BY time_col)按时间顺序取上一次的排名值,注意:ORDER BY 必须是时间维度,不是分数维度 - 两列相减即得“比上次上升/下降几名”,结果为正表示退步(数字变大),负表示进步
为什么 ORDER BY 在 LAG 和 ROW_NUMBER 中要不同?
这是最容易翻车的地方。

