SSMS中实现Job分组内客户代码连续编号并指定优先排序
SQL分组序号与指定排序实现方案
我刚接触SQL仅数日,使用SSMS编写查询语句,当前通过以下SQL统计每个Job_Number对应的客户总数:
SELECT CR_CONTRACT_MASTER1_V.Job_Number, CR_CONTRACT_MASTER1_V.CUSTOMER_CODE, COUNT(CR_CONTRACT_MASTER1_V.Job_Number) OVER (PARTITION BY CR_CONTRACT_MASTER1_V.Job_Number) From CR_CONTRACT_MASTER1_V GROUP BY CR_CONTRACT_MASTER1_V.Job_Number, CR_CONTRACT_MASTER1_V.CUSTOMER_CODE ORDER BY 3 DESC
查询结果:
21-0138 NULT01 3 21-0138 WASAN 3 21-0138 WMRENEW 3 21-0204 AMA12 2 21-0204 GSOI3 2
需求1:生成分组内连续序号
要实现每个Job_Number分组下客户代码对应生成连续序号,可使用ROW_NUMBER()窗口函数,按Job_Number分区后生成序号:
SELECT Job_Number, CUSTOMER_CODE, ROW_NUMBER() OVER (PARTITION BY Job_Number ORDER BY CUSTOMER_CODE) AS 客户序号 FROM CR_CONTRACT_MASTER1_V GROUP BY Job_Number, CUSTOMER_CODE ORDER BY Job_Number, 客户序号
执行后结果:
21-0138 NULT01 1 21-0138 WASAN 2 21-0138 WMRENEW 3 21-0204 AMA12 1 21-0204 GSOI3 2
说明:ROW_NUMBER()会在每个PARTITION BY指定的分组(此处为Job_Number)内,按ORDER BY指定的客户代码字母顺序,生成从1开始的连续序号。
需求2:指定客户代码NULT01始终排在分组首位
要让NULT01在对应Job分组中优先排序,不受字母顺序影响,可在ORDER BY中通过CASE表达式调整排序优先级,再生成序号:
SELECT Job_Number, CUSTOMER_CODE, ROW_NUMBER() OVER ( PARTITION BY Job_Number ORDER BY CASE WHEN CUSTOMER_CODE = 'NULT01' THEN 0 ELSE 1 END, CUSTOMER_CODE ) AS 客户序号 FROM CR_CONTRACT_MASTER1_V GROUP BY Job_Number, CUSTOMER_CODE ORDER BY Job_Number, 客户序号
执行后结果:
21-0138 NULT01 1 21-0138 WASAN 2 21-0138 WMRENEW 3 21-0204 NULT01 1 21-0204 GSOI3 2
说明:CASE表达式将NULT01的排序权重设为0,其他客户设为1,确保NULT01在分组内排在最前面;剩余客户则按字母顺序排序,ROW_NUMBER()基于这个规则生成序号。
内容的提问来源于stack exchange,提问作者Bjorn186
相关产品推荐
相关产品推荐

