Postgres 13 nakonec přidá WITH TIES . Viz:
- Větší nebo rovna ALL() a rovna MAX() rychlosti
Neexistuje žádné WITH TIES klauzule až po PostgreSQL 12, jako je tomu v SQL Server.
V PostgreSQL bych to nahradil za 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 bylo jasno, rank() má pravdu, dense_rank() by bylo špatné (vrací příliš mnoho řádků).
Zvažte tento citát z dokumentů SQL Server (z odkazu výše):
Pokud je například výraz nastaven na 5, ale 2 další řádky odpovídají hodnotám sloupců ORDER BY v řádku 5, bude sada výsledků obsahovat 7 řádků.
Úloha WITH TIES je zahrnout všechny partnery z posledního řádku v horním n jak je definováno v ORDER BY doložka. rank() dává přesně stejný výsledek.
Pro jistotu jsem testoval s SQL serverem, zde je živé demo.
A zde je pohodlnější SQLfiddle.