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

Équivalent PostgreSQL pour TOP n WITH TIES :LIMIT with ties ?

Postgres 13 ajoute enfin WITH TIES . Voir :

  • Supérieur ou égal à ALL() et égal à la vitesse MAX()

Il n'y a pas de WITH TIES clause jusqu'à PostgreSQL 12, comme il y en a dans SQL Server.
Dans PostgreSQL, je remplacerais ceci par 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;

Pour être clair, rank() a raison, dense_rank() serait erroné (renvoyer trop de lignes).
Considérez cette citation de la documentation SQL Server (à partir du lien ci-dessus) :

Par exemple, si l'expression est définie sur 5 mais que 2 lignes supplémentaires correspondent aux valeurs des colonnes ORDER BY de la ligne 5, le jeu de résultats contiendra 7 lignes.

Le métier de WITH TIES est d'inclure tous les pairs de la dernière ligne dans le top n tel que défini par le ORDER BY clause. rank() donne exactement le même résultat.

Pour être sûr, j'ai testé avec SQL Server, voici une démo en direct.
Et voici un SQLfiddle plus pratique.