PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PostgreSQL 13:OGRANICZENIE… Z WIĘZAMI

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!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przegląd metod JOIN w PostgreSQL

  2. PostgreSQL:różnica wydajności NIE W porównaniu z WYJĄTKIEM (edytowane nr 2)

  3. Błąd intarray Postgresql:niezdefiniowany symbol:pfree

  4. Jak połączyć ciągi w polu ciągu w zapytaniu PostgreSQL „grupuj według”?

  5. Błąd Ruby/PgSQL przy starcie Railsów:nie można załadować takiego pliku -- pg_ext (LoadError)