T-Sql

使用自定義順序填充新的排名欄位

  • November 12, 2021

我正在嘗試在我的表中填充一個新的 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. In RANKorDENSE_RANK它可以最大限度地減少聯繫的數量,並且ROW_NUMBER可以提高確定性。

引用自:https://dba.stackexchange.com/questions/302498