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.