La pagination DISTINCT de SQL Server avec ROW_NUMBER () n'est pas distincte

Ok, donc en gros mon DISTINCT est rendu inutile en utilisant ROW_NUMBER() , je dois éviter cela car il provoque des résultats en double (à part un nombre unique de cours!)

Donc, ce que je cherche est une requête qui fonctionnera de la même manière mais qui n'a pas de lignes dupliquées car num est unique:

 WITH t AS ( SELECT DISTINCT *, ROW_NUMBER() OVER (ORDER BY Date) AS num FROM Original_Import LEFT JOIN eqcas.dbo.BASE_PROXY_VIEW_WITHTARGET ON ADName = Targetuser WHERE (BaseProxy = 'agmc' OR ADName = 'agmc') AND (Commited IS NULL OR Commited = 0) ) SELECT DISTINCT ID, num, ADName, Description_User, Description_Amex, Amount, Date FROM t WHERE (t.BaseProxy = 'agmc' OR t.ADName = 'agmc') AND num BETWEEN 0 AND 20 AND (Commited IS NULL OR Commited = 0) ORDER BY Date 

C'est probablement assez sortingvial à corriger, mais vu que je ne suis pas un mec SQL Server, je ne suis pas habitué à ces requêtes internes, etc.

Mise à jour: oui, num est utilisé pour la pagination.

confiance limitée sur ce que je ne peux pas tester ou même comstackr mais c'est l'essentiel de ce que je pensais …

 WITH t AS ( SELECT [insert your fields here], ROW_NUMBER() OVER (ORDER BY Date) AS num FROM ( SELECT DISTINCT *[insert your fields here] FROM Original_Import LEFT JOIN eqcas.dbo.BASE_PROXY_VIEW_WITHTARGET ON ADName = Targetuser WHERE (BaseProxy = 'agmc' OR ADName = 'agmc') AND (Commited IS NULL OR Commited = 0)) as X ) SELECT DISTINCT ID, num, ADName, Description_User, Description_Amex, Amount, Date FROM t WHERE (t.BaseProxy = 'agmc' OR t.ADName = 'agmc') AND num BETWEEN 0 AND 20 AND (Commited IS NULL OR Commited = 0) ORDER BY Date 

On dirait que j'ai deux ans de retard avec mon blog récent sur ROW_NUMBER() en sélectionnant SELECT DENSE_RANK() pour SELECT DISTINCT . Votre CTE devrait être remplacé par ceci:

 WITH t AS ( SELECT DISTINCT *, DENSE_RANK() OVER (ORDER BY Date, ...) AS num FROM Original_Import LEFT JOIN eqcas.dbo.BASE_PROXY_VIEW_WITHTARGET ON ADName = Targetuser WHERE (BaseProxy = 'agmc' OR ADName = 'agmc') AND (Commited IS NULL OR Commited = 0) ) SELECT ... 

Dans la requête ci-dessus, la DENSE_RANK() ORDER BY DENSE_RANK() devra répertorier toutes les colonnes d' Original_Import et de BASE_PROXY_VIEW_WITH_TARGET , afin de reproduire la même command que le DISTINCT key DISTINCT . Cela affectera exactement un rang par jeu d'loggings en double, de telle sorte que DISTINCT fonctionnera à nouveau.

Dans le post de blog référencé , j'ai également inclus un lien vers un SQLFiddle illustrant ceci dans un exemple plus sortingvial.

 SELECT DISTINCT v, DENSE_RANK() OVER (w) row_number FROM t WINDOW w AS (ORDER BY v) ORDER BY v, row_number