方式一:結果集相減
SELECT column1, column2 FROM (SELECT * FROM table_name ORDER BY order_column DESC )
WHERE ROWNUM<=2
MINUS
SELECT column1, column2 FROM (SELECT * FROM table_name ORDER BY order_column DESC )
WHERE ROWNUM<=1
方式二:ROWNUM定位法
-- 查詢第N條記錄
SELECT * FROM (
SELECT
T.*,
ROWNUM AS RN
FROM
table_name T
WHERE
query_column1 = '?'
AND query_column2 = '?'
ORDER BY
order_column DESC) TEMP
WHERE TEMP.RN = 'N'
方式三:子查詢篩選
SELECT
ID,
NAME
FROM
(
SELECT
T.ID,
T.NAME ,
RANK() OVER(ORDER BY order_column) AS RN
FROM
TABLE_NAME T
) TMP
WHERE
TMP.RN + 1 =
(
SELECT
MAX(RN)
FROM
(
SELECT
T.ID,
T.NAME ,
RANK() OVER(ORDER BY order_column) AS RN
FROM
TABLE_NAME T
)
)
RANK()內部排序 及 PARTITION BY結果集分組
-- 查詢每組前五名
SELECT
*
FROM
(
SELECT
E.*,
RANK() OVER (PARTITION BY E.GROUP_COLUMN ORDER BY E.ORDER_COLUMN) RK
FROM
TABLE_NAME E
)
TMP
WHERE
TMP.RK <= 5;
rank()與dense_rank()區別:
相同點:1.都會根據order by 的內容進行遞增排序。2.遇到partition by值相同時RK不會遞增
不同點:1.在下一個相同值rank()會跳號,dense_rank()不會跳號。
2.遇到下一個不同值時rank()會累計,dense_rank() 不會累計。
SELECT
COLUMN1,
COLUMN2,
RANK() OVER(PARTITION BY COLUMN1 ORDER BY COLUMN2 DESC) RK,
DENSE_RANK() OVER(PARTITION BY COLUMN1 ORDER BY COLUMN2 DESC) D_RK
FROM
TABLE_NAME;
COLUMN1 | COLUMN2 | RK | D_RK
-------------------------------------
MON 11000 1 1
TUES 12000 2 2
WED 13000 3 3
THUR 15000 4 4
FRI 15000 4 4
SAT 18000 6 5