窗口函數row_number()
,結合OVER
子句中的PARTITION BY
和ORDER BY
,為數據分組內的每一行生成一個唯一的序號。具體分析如下:
函數作用:
row_number()
:為每個分組內的行分配一個唯一的連續序號(從1開始)。
OVER
子句詳解:
PARTITION BY t1.org_code, t1.customer_code
將數據按?
org_code
(機構代碼)和?customer_code
(客戶代碼)?分組。窗口計算會獨立發生在每個分組內。
ORDER BY t1.id DESC
在每個分組內,按?
id
?字段降序排列(即?id
?值最大的排在最前面)。序號分配基于此排序:最大的?
id
?對應?rank=1
,次大的?id
?對應?rank=2
,以此類推。
結果列名:
生成的序號列名為?
rank
(可在后續查詢中通過此名稱引用)。
典型使用場景示例:
SELECT *
FROM (SELECT t1.*,ROW_NUMBER() OVER (PARTITION BY t1.org_code, t1.customer_codeORDER BY t1.id DESC) AS rankFROM your_table t1
) subquery
WHERE rank = 1; -- 獲取每個分組內最新的一條記錄(id最大)
注意事項:
若需要完全去重(如多行?
id
?相同時只取一條),優先用?ROW_NUMBER()
。若需保留相同?
id
?的所有記錄,改用?RANK()
?或?DENSE_RANK()
。性能:在分區字段(
org_code
,?customer_code
)和排序字段(id
)上建立索引可加速計算。