如何实现先按ColA升序再按分组内ColB重复次数降序的SQL排序?
解决SQL分组内ColB重复次数排序问题
你的核心问题在于窗口函数的分区范围不对——原来的partition by ColB统计的是全局范围内ColB的重复次数,而非每个ColA分组内的次数。要实现需求,需要把ColA也加入分区条件,让统计范围限定在当前ColA分组内。
修正后的SQL语句如下:
SELECT ColA, ColB FROM your_table ORDER BY ColA ASC, COUNT(*) OVER (PARTITION BY ColA, ColB) DESC;
原理说明
PARTITION BY ColA, ColB:将数据先按ColA分组,再在每个ColA分组内按ColB细分,统计每个ColA-ColB组合的出现次数- 排序时先按ColA升序,再按分组内ColB的重复次数降序,就能实现“同ColA下,重复多的ColB排在前面”的效果
示例验证
假设你的表数据如下:
| ColA | ColB |
|---|---|
| 1 | X |
| 1 | X |
| 1 | Y |
| 2 | Y |
| 2 | Z |
| 2 | Z |
| 2 | Z |
执行修正后的SQL后,输出结果会是:
| ColA | ColB |
|---|---|
| 1 | X |
| 1 | X |
| 1 | Y |
| 2 | Z |
| 2 | Z |
| 2 | Z |
| 2 | Y |
可以看到,每个ColA分组内,重复次数多的ColB确实排在了前面。
内容的提问来源于stack exchange,提问作者Nolan Jones
相关产品推荐
相关产品推荐

