Jedną z nowych funkcji PostgreSQL 13 jest standard SQL WITH TIES
klauzula do użycia z LIMIT
— lub, jak to wywołuje standard, FETCH FIRST n ROWS
. Podziękowania dla Surafel Temesgen jako pierwszego autora łatki; Tomas Vondra i wasz naprawdę za kilka dodatkowych poprawek kodu; oraz recenzenci Andrew Gierth i Erik Rijkers. Możesz przeczytać wiadomość o zatwierdzeniu.
Remisy są bardzo często w rankingu rzeczy; na przykład w wyścigu klubowym możesz mieć wiele remisów, a na pewno nie chcesz pozbawiać uczestników ich nagród! Co WITH TIES
robi jest całkiem proste:dodaje dowolny następny wiersz lub wiersze do zestawu wyników, jeśli ich pozycja jest równa ostatniemu wierszowi zwróconemu przez LIMIT
klauzula, zgodnie z ORDER BY
klauzula.
Jeśli potrzebujesz tylko dwóch pracowników z najwyższą pensją, możesz to zrobić:
SELECT * FROM employees ORDER BY salary DESC LIMIT 2;
nazwa | wynagrodzenie | oddział |
---|---|---|
Alicja | 1600 | inżynieria |
Oruga | 1500 | marketing |
Czy masz ochotę poznać pensję następnej osoby? Co jeśli pasuje do Orugi i została pominięta przez czysty przypadek lub pech? To może się zdarzyć, jak dobrze wiesz; i na szczęście WITH TIES
jest teraz tam, aby uratować dzień. (Zauważ, że w rzeczywistości nie obsługujemy WITH TIES
w LIMIT
klauzula jako taka. Musisz użyć FETCH FIRST
składnia, która jest zgodna ze standardami, aby móc używać WITH TIES
.)
SELECT * FROM employees ORDER BY salary DESC FETCH FIRST 2 ROWS WITH TIES;
nazwa | wynagrodzenie | oddział |
---|---|---|
Alicja | 1600 | inżynieria |
Oruga | 1500 | sprzedaż |
Conejo Blanco | 1500 | marketing |
Tam! Biały Królik miał być na liście, a teraz jest.
Kilka notatek, zanim za bardzo się oszalejesz. LIMIT
(a dokładniej FETCH FIRST
) nie obiecuje już zwrócić dokładnie określonej liczby wierszy. Możesz uzyskać dwa lub dwadzieścia dodatkowych wierszy lub 100 razy tyle wierszy, o które prosiłeś. Oznacza to między innymi, że musisz śledzić, ile wierszy widziałeś do tej pory, jeśli przeglądasz wyniki. Powyżej masz trzy wiersze, więc na następnej stronie pomijasz ich, dodając właściwy OFFSET
klauzula:
SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 2 ROWS WITH TIES
OFFSET 3;
nazwa | wynagrodzenie | departament |
---|---|---|
Falsa Tortuga | 1400 | marketing |
Duquesa | 1300 | sprzedaż |
Liebre de Marzo | 1300 | inżynieria |
Znowu dostaliśmy trzy, a nie tylko dwa, o które prosiliśmy. Więc na następnej stronie musiałbyś pominąć sześć. I tak dalej. Upewnij się, że masz wystarczająco dużo naparstków dla wszystkich.
Inną rzeczą, o której należy pamiętać, jest to, że musisz upewnić się, że używasz tylko ORDER BY
klauzula pasująca do WITH TIES
klauzula; jeśli chciałbyś, powiedzmy, uporządkować wiersze z tą samą pensją według nazwy, musiałbyś użyć podzapytania. W przeciwnym razie rozróżnienie imion rozwiązałoby remis pod względem wynagrodzenia, więc następny wiersz nie zostałby uwzględniony. Na przykład:
SELECT * FROM (
SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 2 ROWS WITH TIES) AS subq
ORDER BY salary DESC, name;
Ta funkcja ma pomóc Ci wyświetlić wszystkie wiersze o tej samej wartości — pozwala nie dyskryminować niektórych wierszy o równej wartości wyłącznie na podstawie fizycznej lokalizacji w tabeli.
Miłego stronicowania!