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.