sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL 13:LIMIT … S VAZBAMI

Jednou z nových funkcí v PostgreSQL 13 je standard SQL WITH TIES klauzule k použití s ​​LIMIT — nebo, jak se tomu standardně říká, FETCH FIRST n ROWS . Díky patří Surafel Temesgen jako autorovi počátečního patche; Tomáš Vondra a váš opravdu za některé dodatečné opravy kódu; a recenzenti Andrew Gierth a Erik Rijkers. Můžete si prohlédnout zprávu o odevzdání.

Vazby jsou velmi často při hodnocení věcí; například v caucus závodu můžete mít mnoho remíz a určitě nechcete připravit účastníky o jejich ceny! Co WITH TIES to je docela jednoduché:přidá jakýkoli následující řádek nebo řádky do vaší sady výsledků, pokud mají stejné hodnocení jako poslední řádek vrácený podle LIMIT klauzule podle ORDER BY doložka.

Pokud chcete pouze dva zaměstnance s nejvyšším platem, můžete to udělat takto:

SELECT * FROM employees
ORDER BY salary DESC LIMIT 2;
jméno plat oddělení
Alicia 1600 inženýrství
Oruga 1500 marketing

Takže vás touží znát plat dalšího člověka? Co když se vyrovná Orugovi a byla vynechána čirou náhodou nebo smůlou? To se může stát, jak dobře víte; a naštěstí WITH TIES je teď tam, aby zachránil situaci. (Všimněte si, že ve skutečnosti nezpracováváme WITH TIES v LIMIT doložka jako taková. Musíte použít FETCH FIRST syntaxe, která je standardem nařízená, aby bylo možné používat WITH TIES .)

SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 2 ROWS WITH TIES;
jméno plat oddělení
Alicia 1600 inženýrství
Oruga 1500 prodej
Conejo Blanco 1500 marketing

Tam! Bílý králík měl být uveden na seznamu a nyní je.

Pár poznámek, než se zblázníš. LIMIT (nebo přesněji FETCH FIRST ) již neslibuje, že vrátí přesně takový počet řádků, který určíte. Mohli byste získat dva nebo dvacet dalších řádků nebo 100x tolik řádků, kolik jste požadovali. Mimo jiné to znamená, že musíte mít přehled o tom, kolik řádků jste dosud viděli, pokud stránkujete výsledky. Ve výše uvedeném máte tři řádky, takže na další stránce tolik přeskočíte přidáním správného OFFSET klauzule:

SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 2 ROWS WITH TIES
OFFSET 3;
jméno plat oddělení
Falsa Tortuga 1400 marketing
Duquesa 1300 prodej
Liebre de Marzo 1300 inženýrství

Opět jsme dostali tři, nikoli jen dva, o které jsme žádali. Takže na další stránce byste museli přeskočit šest. A tak dále. Ujistěte se, že máte dostatek náprstek pro všechny.

Další věc, kterou je třeba mít na paměti, je, že se musíte ujistit, že používáte pouze ORDER BY klauzule, která vyhovuje WITH TIES doložka; pokud byste chtěli, řekněme, mít řádky stejného platu seřazené podle jména, museli byste použít dílčí dotaz. V opačném případě by rozlišení ve jménech vyřešilo remízu na platu, takže další řádek by nebyl zařazen. Například:

SELECT * FROM (
       SELECT * FROM employees
       ORDER BY salary DESC
       FETCH FIRST 2 ROWS WITH TIES) AS subq
ORDER BY salary DESC, name;

Tato funkce vám pomůže zobrazit všechny řádky, které mají stejnou hodnotu – umožňuje vám nediskriminovat některé řádky stejné hodnoty pouze na základě fyzického umístění v tabulce.

Příjemné stránkování!


  1. SQL – Jak ukládat a procházet hierarchie?

  2. Jak funguje SCHEMA_NAME() na serveru SQL

  3. Zjistěte, do kterého čtvrtletí v Oracle patří datum

  4. Západka APPEND_ONLY_STORAGE_INSERT_POINT