sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL 13:LIMIET ... MET BANDEN

Een van de nieuwe functies in PostgreSQL 13 is de SQL-standaard WITH TIES clausule te gebruiken met LIMIT — of, zoals de standaard oproept, FETCH FIRST n ROWS . Dank gaat uit naar Surafel Temesgen als eerste patch-auteur; Tomas Vondra en ondergetekende voor enkele aanvullende codecorrecties; en recensenten Andrew Gierth en Erik Rijkers. Je kunt het commit-bericht lezen.

Stropdassen zijn heel vaak bij het rangschikken van dingen; in een caucusrace kun je bijvoorbeeld veel banden hebben, en je wilt deelnemers zeker niet van hun prijzen beroven! Wat WITH TIES doet is vrij eenvoudig:het voegt elke volgende rij of rijen toe aan uw resultatenset, als ze gelijk zijn aan de laatste rij die is geretourneerd volgens de LIMIT clausule, volgens de ORDER BY clausule.

Als u alleen de twee werknemers met het hoogste salaris wilt, kunt u dit doen:

SELECT * FROM employees
ORDER BY salary DESC LIMIT 2;
naam salaris afdeling
Alicia 1600 techniek
Oruga 1500 marketing

Dus sta je te popelen om het salaris van de volgende persoon te weten? Wat als ze overeenkomt met Oruga, en gewoon door puur toeval of pech werd buitengesloten? Dat kan gebeuren, zoals u heel goed weet; en gelukkig, WITH TIES is er nu om de dag te redden. (Merk op dat we in werkelijkheid niet omgaan met WITH TIES in de LIMIT clausule als zodanig. U moet de FETCH FIRST . gebruiken syntaxis, die door de standaarden verplicht is, om WITH TIES te kunnen gebruiken .)

SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 2 ROWS WITH TIES;
naam salaris afdeling
Alicia 1600 techniek
Oruga 1500 verkoop
Conejo Blanco 1500 marketing

Daar! White Rabbit had om te worden vermeld, en nu is hij dat.

Een paar opmerkingen voordat je te gek wordt. LIMIT (of beter gezegd FETCH FIRST ) belooft niet langer precies het aantal rijen dat u opgeeft te retourneren. Je zou twee of twintig extra rijen kunnen krijgen, of 100x zoveel rijen als je vroeg. Dit betekent onder andere dat je moet bijhouden hoeveel rijen je tot nu toe hebt gezien, als je resultaten pagineert. In het bovenstaande heb je drie rijen, dus voor de volgende pagina sla je er zoveel over door de juiste OFFSET toe te voegen clausule:

SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 2 ROWS WITH TIES
OFFSET 3;
naam salaris afdeling
Falsa Tortuga 1400 marketing
Duquesa 1300 verkoop
Liebre de Marzo 1300 techniek

We kregen er weer drie in plaats van slechts twee waar we om vroegen. Dus voor de volgende pagina moet je er zes overslaan. Enzovoort. Zorg ervoor dat je genoeg vingerhoeden voor iedereen hebt.

Het andere om in gedachten te houden is dat je ervoor moet zorgen dat je alleen de ORDER BY . gebruikt clausule die past bij de WITH TIES clausule; als je bijvoorbeeld de rijen met hetzelfde salaris op naam wilt laten sorteren, moet je een subquery gebruiken. Anders zou het onderscheid in namen de gelijkspel op het salaris oplossen, zodat de volgende rij niet zou worden opgenomen. Bijvoorbeeld:

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

Deze functie is er om u te helpen alle rijen met dezelfde waarde weer te geven — u kunt sommige rijen van gelijke waarde niet discrimineren, uitsluitend op basis van de fysieke locatie in de tabel.

Veel plezier met pagineren!


  1. Weken aftrekken van een datum in PostgreSQL

  2. Hekaton met een twist:In-memory TVP's – Deel 1

  3. Hoe mySQL-database te verbinden met C++

  4. Hoe bekijk ik de volledige inhoud van een tekst- of varchar(MAX)-kolom in SQL Server 2008 Management Studio?