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.