sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL-motsvarighet för TOP n WITH TIES:LIMIT med slipsar?

Postgres 13 lägger äntligen till WITH TIES . Se:

  • Större än eller lika med ALL() och lika med MAX() hastighet

Det finns ingen WITH TIES klausul upp till PostgreSQL 12, som det finns i SQL Server.
I PostgreSQL skulle jag ersätta denna med 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;

För att vara tydlig, rank() är rätt, dense_rank() skulle vara fel (returnera för många rader).
Tänk på detta citat från SQL Server-dokumenten (från länken ovan):

Till exempel, om uttrycket är inställt på 5 men ytterligare 2 rader matchar värdena i ORDER BY-kolumnerna på rad 5, kommer resultatuppsättningen att innehålla 7 rader.

Jobbet som WITH TIES är att inkludera alla peers på den sista raden i den översta n enligt definitionen av ORDER BY klausul. rank() ger exakt samma resultat.

För att vara säker, testade jag med SQL-server, här är en livedemo.
Och här är en mer bekväm SQL-fiddle.



  1. PostgreSQL:exportera resulterande data från SQL-fråga till Excel/CSV

  2. Ansluta ODBC-applikationer till MySQL

  3. Fix:"Satsen BACKUP LOG är inte tillåten medan återställningsmodellen är SIMPLE" i SQL Server (och SQL Edge)

  4. Skicka e-post från en utlösare i SQL Server (T-SQL)