SQL使用ROW_NUMBER分区排序时同日期下优先指定STATIONERY为ROW_NUM=1的问题
解决方案
你需要在ROW_NUMBER()的窗口排序规则中新增二级排序条件,给PROD_CD = 'STATIONERY'的记录赋予更高的排序优先级即可,修正后的SQL如下:
SELECT PRODUCT_NUM, CO_Cd, PROD_CD, Date, MASTER_ID, ROW_NUMBER() OVER ( PARTITION BY MASTER_ID ORDER BY Date, CASE WHEN PROD_CD = 'STATIONERY' THEN 1 WHEN PROD_CD = 'PRINTER' THEN 2 ELSE 3 END ) ROW_NUM FROM MyTable ORDER BY MASTER_ID
逻辑说明
- 原有逻辑仅按
Date升序排序,同日期下无明确排序规则,数据库会按照存储顺序随机分配行号 - 新增的二级排序规则通过
CASE语句实现:将STATIONERY类产品的排序权重设为1,PRINTER设为2,其余产品默认设为3,同日期下权重越小排序越靠前,刚好满足优先标记文具类产品为行号1的需求 - 仅包含单条记录的分组不会受二级排序规则影响,原有业务逻辑完全保留
执行上述SQL后,MASTER_ID为10003493039的两条2021/1/1的记录中,PROD_CD = 'STATIONERY'的记录会被标记为ROW_NUM=1,PROD_CD = 'PRINTER'的记录为ROW_NUM=2,符合预期。
内容的提问来源于stack exchange,提问作者KAT
相关产品推荐
相关产品推荐

