我知道如何使用临时表来完成此操作,但我想知道如何使用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 --this gives me the Row column shown above
--I want to add a single line here using ROW_NUMBER() or RANK() to accomplish this
from
#StockOrdersData so
2条答案
按热度按时间efzxgjgh1#
窗口函数 Dense_Rank 将为每个
Item
值提供唯一值例如:
xqkwcwgp2#
dense_rank()
将基于Order by
子句和partition by
子句创建排名。在您的情况下,您对特定粒度不感兴趣,因此我们不需要partition by子句。排名将基于
ASC
顺序中的项目名称创建。如果名称相似,则将提供相同的排名。在row_number
的情况下,如果存在相同的名称,则将为项目A创建排名1、2,为项目B创建排名1、2、3,为项目C创建排名1。这是因为row_number()
不考虑并列关系。另一方面,
Rank()
将为项目A产生1,1,为项目B产生3,3,3,因为当存在重复值时,它跳过了等级通过
dense rank
可以达到您想要的结果