我知道如何使用臨時表來執行此操作,但我想知道如何使用這兩者來執行此操作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
uj5u.com熱心網友回復:
視窗函式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;
uj5u.com熱心網友回復:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/533827.html
標籤:数据库sql服务器数据库表sql-server-2008窗口函数
上一篇:如何在SQL中對一組行進行分類?
