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

PostgreSQL 13:LIMIT … MED BÅND

En af de nye funktioner i PostgreSQL 13 er SQL-standarden WITH TIES klausul til brug med LIMIT — eller, som standarden kalder det, FETCH FIRST n ROWS . Tak skal rettes til Surafel Temesgen som første patchforfatter; Tomas Vondra og jer for nogle ekstra koderettelser; og anmelderne Andrew Gierth og Erik Rijkers. Du kan læse commit-beskeden.

Slips er meget ofte, når man rangordner ting; for eksempel, i et caucus-løb kan du have mange bånd, og du vil helt sikkert ikke fratage deltagerne deres præmier! Hvad WITH TIES gør er ret simpelt:det tilføjer enhver følgende række eller rækker til dit resultatsæt, hvis de rangerer lig med den sidste række, der returneres i henhold til LIMIT klausul i henhold til ORDER BY klausul.

Ønsker du blot de to medarbejdere med den højeste løn, kan du gøre dette:

SELECT * FROM employees
ORDER BY salary DESC LIMIT 2;
navn løn afdeling
Alicia 1600 teknik
Oruga 1500 markedsføring

Så klør du efter at kende lønnen til den næste person? Hvad hvis hun matcher Oruga, og bare blev udeladt ved en ren tilfældighed eller uheld? Det kan ske, som du godt ved; og heldigvis WITH TIES er der nu for at redde dagen. (Bemærk, at vi i virkeligheden ikke håndterer WITH TIES i LIMIT klausul som sådan. Du skal bruge FETCH FIRST syntaks, som er den standardmanderede, for at kunne bruge WITH TIES .)

SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 2 ROWS WITH TIES;
navn løn afdeling
Alicia 1600 teknik
Oruga 1500 salg
Conejo Blanco 1500 markedsføring

Der! White Rabbit havde skal opføres, og nu er han det.

Et par noter før du bliver for gal. LIMIT (eller mere præcist FETCH FIRST ) lover ikke længere at returnere nøjagtigt det antal rækker, du angiver. Du kunne få to eller tyve ekstra rækker, eller 100x så mange rækker, som du bad om. Det betyder blandt andet, at du skal holde styr på, hvor mange rækker du har set indtil videre, hvis du paginerer resultater. I ovenstående har du tre rækker, så til næste side springer du så mange over ved at tilføje den rigtige OFFSET klausul:

SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 2 ROWS WITH TIES
OFFSET 3;
navn løn afdeling
Falsa Tortuga 1400 markedsføring
Duquesa 1300 salg
Liebre de Marzo 1300 teknik

Vi fik igen tre i stedet for blot to, vi bad om. Så for den næste side bliver du nødt til at springe seks over. Og så videre. Sørg for at have nok fingerbøl til alle.

Den anden ting, du skal huske på er, at du skal sørge for kun at bruge ORDER BY klausul, der passer til WITH TIES klausul; hvis du for eksempel ville have rækkerne med den samme løn ordnet efter navn, skulle du bruge en underforespørgsel. Ellers ville skelnen i navne løse uafgjort på lønnen, så næste række ville ikke være med. For eksempel:

SELECT * FROM (
       SELECT * FROM employees
       ORDER BY salary DESC
       FETCH FIRST 2 ROWS WITH TIES) AS subq
ORDER BY salary DESC, name;

Denne funktion er der for at hjælpe dig med at vise alle rækker, der har samme værdi – den lader dig ikke diskriminere mod nogle rækker af samme værdi udelukkende baseret på fysisk placering i tabellen.

God paginering!


  1. Google BigQuery ODBC-driver

  2. Hvordan MID() virker i MariaDB

  3. Slet fra to tabeller i én forespørgsel

  4. Problem ved sammenligning af resultatet af to_char(myDate, 'DAY') med en streng