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.