首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 分類取前 N 筆記錄的 SQL 寫法詳解

     編輯:DB2 教學

實作場景:依類別取得排序前 N 筆資料

在資料庫開發中,常遇到「依類別分組,取每組排序前 N 筆」的需求。例如:各商品類別的熱銷前 3 名、各部門薪資最高的前 2 人等。本文以 DB2 為例,示範如何用子查詢實現「分類取前 N 筆」的邏輯。

範例資料結構

假設有一張表 t1,欄位如下:

  • yTypeCode(類別代碼,VARCHAR(10))
  • yMemo(說明,VARCHAR(10))
  • yOrder(排序依據,INT)

建表與測試資料

CREATE TABLE t1 (
  yTypeCode VARCHAR(10),
  yMemo VARCHAR(10),
  yOrder INT
);

INSERT INTO t1 (yTypeCode, yMemo, yOrder) VALUES ('a', 'aa', 1);
INSERT INTO t1 (yTypeCode, yMemo, yOrder) VALUES ('a', 'aa2', 4);
INSERT INTO t1 (yTypeCode, yMemo, yOrder) VALUES ('a', 'aa3', 6);
INSERT INTO t1 (yTypeCode, yMemo, yOrder) VALUES ('b', 'bb', 1);
INSERT INTO t1 (yTypeCode, yMemo, yOrder) VALUES ('b', 'bb2', 2);
INSERT INTO t1 (yTypeCode, yMemo, yOrder) VALUES ('b', 'bb3', 3);
INSERT INTO t1 (yTypeCode, yMemo, yOrder) VALUES ('c', 'cc', 1);
INSERT INTO t1 (yTypeCode, yMemo, yOrder) VALUES ('c', 'cc2', 5);
INSERT INTO t1 (yTypeCode, yMemo, yOrder) VALUES ('c', 'cc3', 8);

目標結果

取每個類別依 yOrder 遞增排序的前 2 筆:

類別說明排序
aaa1
aaa24
bbb1
bbb22
ccc1
ccc25

SQL 寫法:相關子查詢計數法

SELECT * 
FROM t1 t
WHERE (
  SELECT COUNT(*) 
  FROM t1 
  WHERE yTypeCode = t.yTypeCode 
    AND yOrder < t.yOrder
) < 2;

原理解析

  • 外層查詢逐筆檢視 t1 的每一列(別名 t)。
  • 子查詢統計:同類別(yTypeCode 相同)且排序值(yOrder)小於目前列的筆數。
  • 若該筆數 < 2,代表目前列是該類別前 2 小的排序值 → 保留。
  • 若要取前 N 筆,只要把 2 改成 N 即可。

效能提示

此寫法在資料量小時直觀好懂;大量資料建議改用 ROW_NUMBER() OVER (PARTITION BY yTypeCode ORDER BY yOrder) 視窗函數(DB2 9.7+ 支援),效能通常更佳。

小結

「相關子查詢 + 計數」是解決分組 Top-N 的經典寫法,兼容性高,適合快速原型或舊版 DB2 環境。若專案允許,優先考慮視窗函數以獲得更好執行計畫。

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