如何在同一查询中用ROW_NUMBER()和RANK()为唯一物品生成唯一整数?
用ROW_NUMBER()/RANK()实现统一ItemRow需求
我已经知道怎么用临时表实现这个需求,但为了学习,想搞懂如何同时用ROW_NUMBER()和RANK()来完成。
原始数据
Item Desc Qty Row ItemA ItemDescA 10 1 ItemA ItemDescA 20 2 ItemB ItemDescB 30 3 ItemB ItemDescB 40 4 ItemB ItemDescB 50 5 ItemC ItemDescC 60 6
期望结果
Item Desc Qty Row ItemRow ItemA ItemDescA 10 1 1 ItemA ItemDescA 20 2 1 ItemB ItemDescB 30 3 2 ItemB ItemDescB 40 4 2 ItemB ItemDescB 50 5 2 ItemC ItemDescC 60 6 3
现有代码
select so.* , row_number() over(order by so.[Item], so.Qty) row -- 生成上面的Row列 -- 想在这里加一行用ROW_NUMBER()或RANK()的语句实现需求 from #StockOrdersData so
解决方案
你只需要添加一行窗口函数语句即可,两种方式都能实现每个唯一Item对应统一的ItemRow:
方式1:用RANK()
select so.* , row_number() over(order by so.[Item], so.Qty) row , rank() over(order by so.[Item]) ItemRow -- 新增这行 from #StockOrdersData so
方式2:用DENSE_RANK()
select so.* , row_number() over(order by so.[Item], so.Qty) row , dense_rank() over(order by so.[Item]) ItemRow -- 新增这行 from #StockOrdersData so
说明
RANK()和DENSE_RANK()在这里效果一致,因为每个Item都是连续分组,没有间隔的排名情况。- 两者都会根据
Item的排序,为相同的Item分配同一个排名数字,不同Item按顺序递增,完全匹配你的期望结果。
内容的提问来源于stack exchange,提问作者whatwhatwhat
相关产品推荐
相关产品推荐

