DB2 子查詢不支援 ORDER BY,但提供 OLAP 函數完美解決:
SELECT * FROM (
SELECT MYKEY, RANK() OVER (ORDER BY ORD_COL DESC) AS MYRANK
FROM MYTABLE
) AS RANKED_TABLE
WHERE MYRANK <= N
SELECT * FROM (
SELECT MYKEY, ROW_NUMBER() OVER (ORDER BY ORD_COL DESC) AS MYRANK
FROM MYTABLE
) AS RANKED_TABLE
WHERE MYRANK <= N
SELECT * FROM (
SELECT MYKEY, DENSE_RANK() OVER (ORDER BY ORD_COL DESC) AS MYRANK
FROM MYTABLE
) AS RANKED_TABLE
WHERE MYRANK <= N
| 方法 | TOP 3 結果 | 特點 |
|---|---|---|
| M1 (ROW_NUMBER) | 1(101), 2(101), 3(100) | 強制連續編號,可能任意切割同值 |
| M2 (RANK) | 1(101), 1(101), 3(100), 3(100) | 同值同排名,後續跳號 |
| M3 (DENSE_RANK) | 1(101), 1(101), 2(100), 2(100), 3(99) | 同值同排名,不跳號 |
SELECT * FROM MYTABLE M1
WHERE N > (SELECT COUNT(*) FROM MYTABLE M2 WHERE M2.ORD_COL > M1.ORD_COL)
SELECT * FROM MYTABLE M1
WHERE N > (SELECT COUNT(DISTINCT M2.ORD_COL) FROM MYTABLE M2 WHERE M2.ORD_COL > M1.ORD_COL)
差異在於 DISTINCT 關鍵字。M1 尚無理想標準寫法。
早期版本不支援子查詢,需用自我連接:
SELECT * FROM MYTABLE M1, MYTABLE M2
WHERE M2.ORD_COL >= M1.ORD_COL
GROUP BY M1.MYKEY
HAVING COUNT(M2.ORD_COL) <= N
缺陷: 當所有 ORD_COL 數值相同時邏輯失效。需進一步改良。
CREATE TABLE mytable(mykey INT, ord_col INT);
INSERT INTO mytable VALUES(1,100),(2,100),(3,99),(4,101),(5,101);