SQL Server DISTINCT与ROW_NUMBER()的分页并不明显

Joh*_*unt 5 sql sql-server pagination distinct

好的,所以基本上我DISTINCT的使用变得无用ROW_NUMBER(),我需要避免这种情况,因为它会导致重复的结果(当然,除了一个独特的数字!)

所以我正在寻找的是一个查询,它将工作相同,但没有重复行,因为num是唯一的:

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
Run Code Online (Sandbox Code Playgroud)

修复它可能相当简单,但看到我不是SQL Server的人,我不习惯这些内部查询等.

更新:是,num用于分页.

Luk*_*der 12

好像我晚两年我最近的博客帖子大约ROW_NUMBER()是到SELECT什么DENSE_RANK()是对SELECT DISTINCT.您的CTE必须由此替换:

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 ...
Run Code Online (Sandbox Code Playgroud)

在上面的查询中,DENSE_RANK()'s ORDER BY子句需要列出来自Original_Import和来自的所有列BASE_PROXY_VIEW_WITH_TARGET,以重现与DISTINCT关键字相同的顺序.这将为每个重复记录集准确分配一个等级,这样DISTINCT可以再次使用.

引用的博客文章中,我还包含一个指向SQLFiddle的链接,在一个更简单的例子中说明了这一点.

SELECT DISTINCT
  v, 
  DENSE_RANK() OVER (w) row_number
FROM t
WINDOW w AS (ORDER BY v)
ORDER BY v, row_number
Run Code Online (Sandbox Code Playgroud)

可以在此处的帖子中找到解释为什么在计算窗函数之后DISTINCT删除重复行的原因.

  • 你的答案可能已经迟了两年了,但是对我来说,我又迟到了一年.谢谢你!;) (2认同)

xQb*_*ert 5

由于我无法测试甚至编译,因此对此有限的信心,但这是我所想的一般要点......

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
Run Code Online (Sandbox Code Playgroud)