T-Sql
使用自定義順序填充新的排名欄位
我正在嘗試在我的表中填充一個新的 Rank 欄位。這是它應該是什麼樣子的範例。
+-----------+------------+------+ | CountryId | CreateDate | Rank | +-----------+------------+------+ | 1 | 2020-01-01 | 4 | | 1 | 2020-02-01 | 3 | | 1 | 2020-02-01 | 2 | | 1 | 2020-03-01 | 1 | | 2 | 2020-01-01 | 1 | | 2 | 2020-02-01 | 2 | | 3 | 2020-01-01 | 1 | +-----------+------------+------+
因此 Rank 欄位必須由 count of 填充
CountryId
並按 排序CreateDate
,因此最新記錄具有最高排名(最低數字)。注意
CreateDate
:兩條記錄可能會發生相同的情況,在這種情況下Rank
應該仍然增加。程式碼:
with rankUpdate as ( select t.*, DENSE_RANK() over (partition by CountryId order by CreatedDate) AS NewRank from Countries t ) update rankUpdate set [Rank] = NewRank;
在處理排名期間“捆綁”的行時,有多個期望的結果。
RANK
將為“並列”的行分配相同的編號,然後留出空隙。(例如 1,2,2,4,4,6,7…)
DENSE_RANK
還將為“並列”的行分配相同的編號,但不留空隙。(例如 1,2,2,3,3,4,5)
ROW_NUMBER
將分配連續增加的數字,沒有間隙。當兩個值被“捆綁”時,它將隨機確定順序。請注意,隨機性是不確定的。它可能會連續 10000 次返回相同的“隨機”訂單,然後突然重新排序它對綁定行的編號方式。聽起來您正在尋找
ROW_NUMBER
:select t.*, ROW_NUMBER() over (partition by CountryId order by CreatedDate) AS NewRank from Countries t
如果有可用作決勝局的輔助標準,您始終可以將第二列添加到
ORDER BY
. InRANK
orDENSE_RANK
它可以最大限度地減少聯繫的數量,並且ROW_NUMBER
可以提高確定性。