Oracle 12c / Top N řádků, stránkování
Top N řádků
Omezení seřazených dat podle počtu řádků se ve starších verzích muselo realizovat vnořeným dotazem. Ten tabulku nejprve uspořádal a až poté bylo možné odfiltrovat počet.
SELECT * FROM ( SELECT last_name , salary FROM employees ORDER BY salary DESC ) WHERE (ROWNUM<=2) ;
Oracle 12c začleňuje syntax normy ANSI/ISO SQL:2008. Použít lze jak formát ROWS ONLY
, který vrací přesný počet řádků, tak i ROWS WITH TIES
, kde pokud následující řádky po řádku posledním obsahují duplicity, vrátí se i tyto.
SELECT last_name , salary FROM employees ORDER BY salary FETCH FIRST 2 ROWS ONLY ;
SELECT last_name , salary FROM employees ORDER BY salary FETCH FIRST 2 ROWS WITH TIES ;
Top N procent řádků
Podobnou konstrukci lze využít i pro procentuální podíl řádků.
SELECT last_name , salary FROM employees ORDER BY salary FETCH FIRST 2 PERCENT ROWS ONLY ;
Stránkování
Ještě méně přehledný složený dotaz byl dříve zapotřebí pro stránkování. Nejdříve seřazení, poté omezení horní hranice a na závěr omezení zespodu.
SELECT last_name , salary FROM ( SELECT e.* , ROWNUM AS start_from FROM ( SELECT * FROM employees ORDER BY salary ) e WHERE (ROWNUM<=4) ) WHERE (start_from>2) ;
Nový přístup je nesrovnatelně jednodušší. Oba příklady vrací třetího a čtvrtého zaměstnance s nejmenším platem.
SELECT last_name , salary FROM employees ORDER BY salary OFFSET 2 ROWS FETCH NEXT 2 ROWS ONLY ;