SQL Server 如何在同一查询中使用ROW_NUMBER()和RANK()为每个唯一项获取唯一整数?

n9vozmp4  于 2022-11-21  发布在  其他
关注(0)|答案(2)|浏览(107)

我知道如何使用临时表来完成此操作,但我想知道如何使用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
efzxgjgh

efzxgjgh1#

窗口函数 Dense_Rank 将为每个Item值提供唯一值
例如:

with t as (
  select * from(values('ItemA'), ('ItemA'), ('ItemB'), ('ItemB'), ('ItemB'), ('ItemC'))t(Item)
)
select *, Dense_Rank() over(order by item) Itemrow
from t;
xqkwcwgp

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可以达到您想要的结果

select 
*,
dense_rank() over(order by item) as rank
from table

相关问题