2019-01-31

【Oracle】查詢當 欄位1 值相同時,取 欄位2, 3, ... 排序後第一筆記錄

查詢當 欄位1 值相同時,取 欄位2, 3, ... 排序後第一筆記錄

通常用在某欄位值相同時有數筆記錄,只取第一筆。


 
SELECT * FROM
(
    SELECT a.*, row_number() OVER (PARTITION BY field1 ORDER BY field2 DESC, field3 DESC) rn FROM
    (
        SELECT field1, field2, field3, field4, field5  FROM table1
            WHERE field5='關鍵值'
    ) a
) WHERE rn=1
 


其實這個語法也可以用於排序,例如不同的資料庫語言在取前幾筆記錄的實做,語法各不相同,例如:
MySQL 用 LIMIT
MSSQL 用 TOP
Oracle 用 rownum


若您公司有個資料庫同時存在於二個(以上) 的平台(例如 MSSQL 用於即時交易,每日結算後,將資料轉入 Oracle,在 Oracle 進行大量的資料分析),想要有一個通用於不同平台的語法,上述的語法就用的上。

曾經看到有篇專欄文章,就推薦這種做法,避免使用資料庫的專屬指令。