SQL实现多分组内按指定字段排序排名的优化方法
优化实现方案
你可以直接用窗口函数自带的PARTITION BY语法实现分组内排名,不需要拆分分组再UNION合并,代码如下:
SELECT *, RANK() OVER ( PARTITION BY Division ORDER BY Wins DESC ) AS `Rank` FROM Teams;
方案说明
PARTITION BY Division会自动将所有数据按Division字段的值划分为独立的分组,后续新增Division也不需要修改SQL逻辑- 每个分组内单独按Wins降序计算排名,和你原来的计算规则完全一致
- 整个查询只需要扫描一次表,相比多次扫表再UNION的方案性能提升明显
可选排名规则调整
如果业务场景需要调整排名逻辑,可以替换RANK()为其他窗口函数:
- 用
DENSE_RANK():同值排名相同,后续排名不跳号(比如两个第1名之后是第2名,不是第3名) - 用
ROW_NUMBER():同值也会分配不同的连续排名,不会出现重复名次
内容的提问来源于stack exchange,提问作者Moiz Ahmed
相关产品推荐
相关产品推荐

