Postgres 13 накрая добавя WITH TIES . Вижте:
- По-голяма или равна на ALL() и равна на MAX() скорост
Няма WITH TIES клауза до PostgreSQL 12, както има в SQL Server.
В PostgreSQL бих заменил това с 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;
За да бъде ясно, rank() е прав, dense_rank() би било погрешно (връща твърде много редове).
Помислете за този цитат от документите на SQL Server (от връзката по-горе):
Например, ако изразът е зададен на 5, но 2 допълнителни реда съвпадат със стойностите на колоните ORDER BY в ред 5, резултантният набор ще съдържа 7 реда.
Работата на WITH TIES е да включите всички партньори от последния ред в горния n както е дефинирано от ORDER BY клауза. rank() дава абсолютно същия резултат.
За да се уверя, тествах със SQL сървър, ето демонстрация на живо.
И тук е по-удобен SQLfiddle.