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í!