SQL中如何基于Total列生成同值同序号的Order列?
解决方案
你需要用DENSE_RANK()窗口函数替代ROW_NUMBER(),它会为相同的Total值分配相同的序号,且序号是连续的,完全匹配你的预期结果。
完整SQL语句示例
SELECT "Groupe", "Count", SUM("Count") OVER (PARTITION BY "Groupe") AS "Total", DENSE_RANK() OVER (ORDER BY SUM("Count") OVER (PARTITION BY "Groupe") DESC) AS "Order" FROM your_table_name;
结果说明
SUM("Count") OVER (PARTITION BY "Groupe")继续用于计算每个分组的累计总和TotalDENSE_RANK() OVER (ORDER BY ... DESC)会根据Total的降序排序,相同Total值的行获得相同的序号,序号不会出现跳跃(比如如果有多个相同的最大值,都标记为1,下一个不同值标记为2)
如果使用RANK()函数,当有相同值时,后续序号会跳过对应数量的位置(比如两个1之后,下一个是3),而你的预期结果需要连续的序号,所以DENSE_RANK()是更合适的选择。
验证结果
执行上述语句后,会得到你想要的输出:
Groupe | Count | Total | Order A | 22 | 32 | 1 B | 12 | 28 | 2 A | 10 | 32 | 1 B | 16 | 28 | 2
内容的提问来源于stack exchange,提问作者Nabs335
相关产品推荐
相关产品推荐

