sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL-equivalent voor TOP n WITH TIES:LIMIT with ties?

Postgres 13 voegt ten slotte WITH TIES toe . Zie:

  • Groter dan of gelijk aan ALL() en gelijk aan MAX() snelheid

Er is geen WITH TIES clausule tot PostgreSQL 12, zoals in SQL Server.
In PostgreSQL zou ik dit vervangen door 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;

Voor alle duidelijkheid:rank() heeft gelijk, dense_rank() zou verkeerd zijn (te veel rijen retourneren).
Beschouw dit citaat uit de SQL Server-documenten (van de link hierboven):

Als expressie bijvoorbeeld is ingesteld op 5 maar 2 extra rijen overeenkomen met de waarden van de ORDER BY-kolommen in rij 5, bevat de resultaatset 7 rijen.

Het werk van WITH TIES is om alle peers van de laatste rij bovenaan op te nemen n zoals gedefinieerd door de ORDER BY clausule. rank() geeft exact hetzelfde resultaat.

Om er zeker van te zijn, heb ik getest met SQL-server, hier is een live demo.
En hier is een handiger SQLfiddle.



  1. Eenvoudige parametrering en triviale plannen - deel 1

  2. Logische replicatiepartitionering met PostgreSQL 13

  3. Hoe STR_TO_DATE() werkt in MariaDB

  4. Querygeschiedenis bekijken in SQL Server Management Studio