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

SELECT TOP N 問題深度討論(二):DB2 OLAP 函數、三種排名語意、ANSI SQL 標準寫法與 MySQL 限制

     編輯:關於SqlServer

DB2 OLAP 函數解決 TOP N

DB2 子查詢不支援 ORDER BY,但提供 OLAP 函數完美解決:

M2:RANK() 允許同排名跳號

SELECT * FROM (
    SELECT MYKEY, RANK() OVER (ORDER BY ORD_COL DESC) AS MYRANK
    FROM MYTABLE
) AS RANKED_TABLE
WHERE MYRANK <= N

M1 替代:ROW_NUMBER() 強制連續編號

SELECT * FROM (
    SELECT MYKEY, ROW_NUMBER() OVER (ORDER BY ORD_COL DESC) AS MYRANK
    FROM MYTABLE
) AS RANKED_TABLE
WHERE MYRANK <= N

M3:DENSE_RANK() 同排名不跳號

SELECT * FROM (
    SELECT MYKEY, DENSE_RANK() OVER (ORDER BY ORD_COL DESC) AS MYRANK
    FROM MYTABLE
) AS RANKED_TABLE
WHERE MYRANK <= N

三種排名語意對比(範例資料:101,101,100,100,99)

方法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)同值同排名,不跳號

ANSI SQL-92 標準寫法(跨 DBMS 相容)

M2 標準寫法

SELECT * FROM MYTABLE M1 
WHERE N > (SELECT COUNT(*) FROM MYTABLE M2 WHERE M2.ORD_COL > M1.ORD_COL)

M3 標準寫法

SELECT * FROM MYTABLE M1 
WHERE N > (SELECT COUNT(DISTINCT M2.ORD_COL) FROM MYTABLE M2 WHERE M2.ORD_COL > M1.ORD_COL)

差異在於 DISTINCT 關鍵字。M1 尚無理想標準寫法。

MySQL 限制與變通

早期版本不支援子查詢,需用自我連接:

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);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved