Nombre total de lignes SQL (DENSE_RANK / DISTINCT)

Je sélectionne les loggings qui peuvent contenir des duplicates, je dois être en mesure de paginer un set de résultats distincts.

Pour le moment, j'ai la requête (simplifiée) suivante:

SELECT pagiWrapper.* FROM ( SELECT DISTINCT alias.id , alias.name , DENSE_RANK() OVER (ORDER BY alias.name ASC) AS 'paginationRowNo' , COUNT(*) OVER(PARTITION BY 1) AS 'paginationTotalRows' FROM MyTable alias LEFT JOIN MyTableTwo alias2 ON alias2.id = alias.id WHERE ( /* condition */) ) pagiWrapper WHERE pagiWrapper.paginationRowNo > 0 AND pagiWrapper.paginationRowNo <= 15 

Il y a 10 loggings dans ce jeu de résultats, cependant DISTINCT renvoie correctement 3, et DENSE_RANK marque correctement 1 , 2 et 3

Mon problème est que paginationTotalRows renvoie toujours 10 (le nombre original de duplicates inclus) le nombre d'sets de résultats, comment puis-je modifier la requête afin que paginationTotalRows renvoie le montant correct?

Déplacez la fonction de fenêtrage en dehors du select distinct . Je suggère également que vous utilisiez row_number () au lieu de DRIVER_RANK ().

 SELECT pagiWrapper.* FROM ( SELECT iq.* , ROW_NUMBER() OVER (ORDER BY iq.name ASC) AS 'paginationRowNo' , COUNT(*) OVER (PARTITION BY 1) AS 'paginationTotalRows' FROM ( SELECT DISTINCT alias.id , alias.name , alias2.something_I_hope FROM MyTable alias LEFT JOIN MyTableTwo alias2 ON alias2.id = alias.id WHERE (1 = 1 /* condition */) ) iq ) pagiWrapper WHERE pagiWrapper.paginationRowNo > 0 AND pagiWrapper.paginationRowNo <= 15 

Je recommand ROW_NUMBER() pour la pagination. Cette fonction ne peut pas répéter un nombre dans une partition et, si elle n'est pas partitionnée, elle ne peut pas répéter un nombre du tout. DENSE_RANK() peut cependant répéter un nombre dans n'importe quelle partition et, s'il n'est pas partitionné, peut toujours répéter des nombres. Pour que la pagination soit totalement prévisible, vous avez besoin d'une numérotation des lignes totalement prévisible, utilisez ROW_NUMBER() . [S'il vous plaît]

Essayez de find MAX(paginationRowNo) dans la requête du haut:

  SELECT pagiWrapper.* FROM( SELECT *, MAX(paginationRowNo) OVER(PARTITION BY 1) as 'paginationTotalRows' FROM ( SELECT DISTINCT alias.id , alias.name , DENSE_RANK() OVER (ORDER BY alias.name ASC) AS 'paginationRowNo' FROM MyTable alias LEFT JOIN MyTableTwo alias2 ON alias2.id = alias.id WHERE ( /* condition */) ) as PW ) pagiWrapper WHERE pagiWrapper.paginationRowNo > 0 AND pagiWrapper.paginationRowNo <= 15