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.