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
;

Zanechte komentář

Vaše emailová adresa nebude zobrazena. Povinná pole jsou označena *