PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

PostgreSQL 13 :LIMITER… AVEC DES LIENS

L'une des nouvelles fonctionnalités de PostgreSQL 13 est le standard SQL WITH TIES clause à utiliser avec LIMIT — ou, comme l'appelle la norme, FETCH FIRST n ROWS . Des remerciements sont dus à Surafel Temesgen en tant qu'auteur initial du patch; Tomas Vondra et votre serviteur pour quelques corrections de code supplémentaires ; et les critiques Andrew Gierth et Erik Rijkers. Vous pouvez consulter le message de validation.

Les liens sont très fréquents lors du classement des choses; par exemple, dans une course de caucus, vous pourriez avoir de nombreuses égalités, et vous ne voulez certainement pas priver les participants de leurs prix ! Quoi WITH TIES fait est assez simple :il ajoute toute ligne ou lignes suivantes à votre ensemble de résultats, si elles sont égales à la dernière ligne renvoyée par le LIMIT clause, selon le ORDER BY clause.

Si vous ne voulez que les deux employés avec le salaire le plus élevé, vous pouvez faire ceci :

SELECT * FROM employees
ORDER BY salary DESC LIMIT 2;
nom salaire département
Alicia 1600 ingénierie
Oruga 1500 marketing

Alors ça vous démange de connaître le salaire de la prochaine personne ? Et si elle correspond à Oruga et qu'elle a été laissée de côté par pur hasard ou par malchance? Cela peut arriver, comme vous le savez bien; et heureusement, WITH TIES est maintenant là pour sauver la situation. (Notez qu'en réalité, nous ne traitons pas WITH TIES dans la LIMIT clause en tant que telle. Vous devez utiliser le FETCH FIRST syntaxe, qui est celle imposée par les normes, afin de pouvoir utiliser WITH TIES .)

SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 2 ROWS WITH TIES;
nom salaire département
Alicia 1600 ingénierie
Oruga 1500 ventes
Conejo Blanco 1500 marketing

Là! Le lapin blanc avait être listé, et maintenant il l'est.

Quelques notes avant de devenir trop fou. LIMIT (ou plus précisément FETCH FIRST ) ne promet plus de renvoyer exactement le nombre de lignes que vous spécifiez. Vous pouvez obtenir deux ou vingt lignes supplémentaires, ou 100 fois plus de lignes que vous avez demandées. Entre autres choses, cela signifie que vous devez garder une trace du nombre de lignes que vous avez vues jusqu'à présent, si vous paginez les résultats. Dans ce qui précède, vous avez trois lignes, donc pour la page suivante, vous en sautez autant en ajoutant le bon OFFSET clause :

SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 2 ROWS WITH TIES
OFFSET 3;
nom salaire département
Falsa Tortuga 1400 marketing
Duquesa 1300 ventes
Liebre de Marzo 1300 ingénierie

Nous en avons encore obtenu trois au lieu de seulement deux que nous avions demandés. Donc, pour la page suivante, vous devrez en sauter six. Etc. Assurez-vous d'avoir suffisamment de dés à coudre pour tout le monde.

L'autre chose à garder à l'esprit est que vous devez vous assurer de n'utiliser que le ORDER BY clause qui convient au WITH TIES clause; si vous vouliez, par exemple, que les lignes du même salaire soient classées par nom, vous deviez utiliser une sous-requête. Sinon, la distinction dans les noms résoudrait l'égalité des salaires, de sorte que la ligne suivante ne serait pas incluse. Par exemple :

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

Cette fonctionnalité est là pour vous aider à afficher toutes les lignes qui ont la même valeur. Elle vous permet de ne pas discriminer certaines lignes de valeur égale uniquement en fonction de leur emplacement physique dans le tableau.

Bonne pagination !