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

Odpowiednik PostgreSQL dla TOP n WITH TIES:LIMIT z powiązaniami?

Postgres 13 w końcu dodaje WITH TIES . Zobacz:

  • Większe lub równe ALL() i równe MAX() prędkości

Nie ma WITH TIES klauzula aż do PostgreSQL 12, tak jak w SQL Server.
W PostgreSQL zamieniłbym to na TOP n WITH TIES .. ORDER BY <something> :

WITH cte AS (
   SELECT *, rank() OVER (ORDER BY <something>) AS rnk
   FROM   tbl
   )
SELECT *
FROM   cte
WHERE  rnk <= n;

Aby było jasne, rank() ma rację, dense_rank() byłoby błędne (zwróć zbyt wiele wierszy).
Rozważ ten cytat z dokumentacji SQL Server (z powyższego łącza):

Na przykład, jeśli wyrażenie jest ustawione na 5, ale 2 dodatkowe wiersze pasują do wartości kolumn ORDER BY w wierszu 5, zestaw wyników będzie zawierał 7 wierszy.

Praca WITH TIES jest uwzględnienie wszystkich rówieśników z ostatniego wiersza na górze n zgodnie z definicją ORDER BY klauzula. rank() daje dokładnie ten sam wynik.

Aby się upewnić, testowałem z serwerem SQL, oto demo na żywo.
A tutaj jest wygodniejszy SQLfiddle.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Najlepszy sposób na usunięcie milionów wierszy według identyfikatora

  2. Zdefiniować nazwy tabel i kolumn jako argumenty w funkcji plpgsql?

  3. LIKE zapytanie dotyczące elementów płaskiej tablicy jsonb

  4. Znajdź obiekty zależne dla tabeli lub widoku

  5. Jak działa funkcja Radians() w PostgreSQL