Top-N Queries
Top-N queries provide a method for limiting the number of rows returned from ordered sets of data.
oracle miscconfigurationintermediate
by OracleDba
11 views
Top-N queries provide a method for limiting the number of rows returned from ordered sets of data.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
DROP TABLE rownum_order_test;
CREATE TABLE rownum_order_test (
val NUMBER
);
INSERT ALL
INTO rownum_order_test
INTO rownum_order_test
SELECT level
FROM dual
CONNECT BY level <= 10;
COMMIT;
SELECT val
FROM rownum_order_test
ORDER BY val;
VAL
----------
1
1
2
2
3
3
4
4
5
5
6
VAL
----------
6
7
7
8
8
9
9
10
10
20 rows selected.
SQL>12345678910111213141516
SELECT val
FROM rownum_order_test
WHERE rownum <= 5
ORDER BY val DESC;
VAL
----------
5
4
3
2
1
5 rows selected.
SQL>12345678910111213141516
SELECT val
FROM rownum_order_test
ORDER BY val DESC
FETCH FIRST 5 ROWS ONLY;
VAL
----------
10
10
9
9
8
5 rows selected.
SQL>1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
SELECT val
FROM (SELECT val
FROM rownum_order_test
ORDER BY val DESC)
WHERE ROWNUM <= 5;
VAL
----------
10
10
9
9
8
5 rows selected.
SQL>
SELECT val
FROM (SELECT val
FROM rownum_order_test
ORDER BY val)
WHERE rownum <= 5;
VAL
----------
1
1
2
2
3
5 rows selected.
SQL>
SELECT val
FROM (SELECT val, rownum AS rnum
FROM (SELECT val
FROM rownum_order_test
ORDER BY val)
WHERE rownum <= 8)
WHERE rnum >= 4;
VAL
----------
2
3
3
4
4
5 rows selected.
SQL>
Execution Plan
----------------------------------------------------------
Plan hash value: 2927523340
----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 8 | 208 | 4 (25)| 00:00:01 |
|* 1 | VIEW | | 8 | 208 | 4 (25)| 00:00:01 |
|* 2 | COUNT STOPKEY | | | | | |
| 3 | VIEW | | 100 | 1300 | 4 (25)| 00:00:01 |
|* 4 | SORT ORDER BY STOPKEY| | 100 | 1300 | 4 (25)| 00:00:01 |
| 5 | TABLE ACCESS FULL | ROWNUM_ORDER_TEST | 100 | 1300 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("RNUM">=4)
2 - filter(ROWNUM<=8)
4 - filter(ROWNUM<=8)12345678910111213141516171819
WITH ordered_query AS
(SELECT val
FROM rownum_order_test
ORDER BY val DESC)
SELECT val
FROM ordered_query
WHERE rownum <= 5;
VAL
----------
10
10
9
9
8
5 rows selected.
SQL>12345678910111213141516171819202122232425262728293031323334353637
SELECT val
FROM (SELECT val,
RANK() OVER (ORDER BY val DESC) AS val_rank
FROM rownum_order_test)
WHERE val_rank <= 5;
VAL
----------
10
10
9
9
8
8
6 rows selected.
SQL>
SELECT val, val_rank
FROM (SELECT val,
RANK() OVER (ORDER BY val DESC) AS val_rank
FROM rownum_order_test)
WHERE val_rank <= 5;
VAL VAL_RANK
---------- ----------
10 1
10 1
9 3
9 3
8 5
8 5
6 rows selected.
SQL>123456789101112131415161718192021222324252627282930313233343536373839404142434445
SELECT val
FROM (SELECT val,
DENSE_RANK() OVER (ORDER BY val DESC) AS val_rank
FROM rownum_order_test)
WHERE val_rank <= 5;
VAL
----------
10
10
9
9
8
8
7
7
6
6
10 rows selected.
SQL>
SELECT val, val_rank
FROM (SELECT val,
DENSE_RANK() OVER (ORDER BY val DESC) AS val_rank
FROM rownum_order_test)
WHERE val_rank <= 5;
VAL VAL_RANK
---------- ----------
10 1
10 1
9 2
9 2
8 3
8 3
7 4
7 4
6 5
6 5
10 rows selected.
SQL>1234567891011121314151617
SELECT val
FROM (SELECT val,
ROW_NUMBER() OVER (ORDER BY val DESC) AS val_row_number
FROM rownum_order_test)
WHERE val_row_number <= 5;
VAL
----------
10
10
9
9
8
5 rows selected.
SQL>12345678910111213141516
SELECT val
FROM (SELECT val,
PERCENT_RANK() OVER (ORDER BY val) AS val_percent_rank
FROM rownum_order_test)
WHERE val_percent_rank >= 0.8;
VAL
----------
9
9
10
10
4 rows selected.
SQL>123456789101112131415161718
SELECT val
FROM (SELECT val,
NTILE(3) OVER (ORDER BY val) AS val_ntile
FROM rownum_order_test)
WHERE val_ntile = 3;
VAL
----------
8
8
9
9
10
10
6 rows selected.
SQL>Please to add comments
No comments yet. Be the first to comment!