sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgreSQL-ækvivalent for TOP n WITH TIES:LIMIT with ties?

Postgres 13 tilføjer endelig WITH TIES . Se:

  • Større end eller lig med ALL() og lig med MAX() hastighed

Der er ingen WITH TIES klausul op til PostgreSQL 12, som der er i SQL Server.
I PostgreSQL ville jeg erstatte denne med TOP n MED BINDELSER .. BESTIL EFTER :

WITH cte AS (
   SELECT *, rank() OVER (ORDER BY <something>) AS rnk
   FROM   tbl
   )
SELECT *
FROM   cte
WHERE  rnk <= n;

For at være tydelig, rank() er rigtigt, dense_rank() ville være forkert (returnerer for mange rækker).
Overvej dette citat fra SQL Server-dokumenterne (fra linket ovenfor):

For eksempel, hvis udtryk er sat til 5, men 2 yderligere rækker matcher værdierne af ORDER BY kolonnerne i række 5, vil resultatsættet indeholde 7 rækker.

Jobbet som WITH TIES er at inkludere alle peers i den sidste række i den øverste n som defineret af ORDER BY klausul. rang() giver nøjagtig samme resultat.

For at være sikker, testede jeg med SQL-server, her er en live-demo.
Og her er en mere praktisk SQLfiddle.



  1. Rails 3 ActiveRecord:Bestil efter tilslutning

  2. Konfigurer Hibernate til at bruge Oracles SYS_GUID() til primærnøgle

  3. Nummerseriegenerator-udfordringsløsninger – Del 2

  4. Sådan fungerer Tand() i PostgreSQL