首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 分組取 Top N 寫法:ROW_NUMBER() OVER 窗口函數實戰

     編輯:Oracle 資料庫相關知識

需求:依欄位 A 分組,組內依欄位 B 降序排列,取每組前 3 筆資料。Oracle 12c+ 可用 FETCH FIRST,但通用寫法仍是窗口函數 ROW_NUMBER()。

標準寫法

SELECT *
FROM (
    SELECT T.B,
           T.A,
           ROW_NUMBER() OVER (PARTITION BY T.A ORDER BY T.B DESC) AS RN
    FROM YOUR_TABLE T
)
WHERE RN <= 3;

關鍵點解析

  • PARTITION BY T.A:依 A 分組,各組獨立計算行號
  • ORDER BY T.B DESC:組內按 B 降序,最大值行號為 1
  • ROW_NUMBER():生成 1,2,3... 不重複行號(同序值也強制區分)
  • 外層 WHERE RN <= 3:過濾取前 3 名

進階變體

需求函數選擇差異
允許同序並列RANK()同分同名次,下一名次跳號(1,1,3)
同序並列且不跳號DENSE_RANK()同分同名次,下一名次不跳(1,1,2)
分頁查詢ROW_NUMBER()配合 BETWEEN 實現精確分頁

效能提示

  • 確保 (A, B) 上有索引,支援 PARTITION BY ... ORDER BY 的排序消除
  • 大資料量時,考慮物化視圖預先計算 Top N
  • 12c+ 可簡寫為:SELECT * FROM T ORDER BY A, B DESC FETCH FIRST 3 ROWS PER GROUP(需 12.1.0.2+)

此模式廣泛應用於:各部門薪資前三、各類別熱銷商品、各用戶最近登入記錄等場景,是 Oracle 開發必備技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved