回答

收藏

不区分ROW_NUMBER()的SQL Server DISTINCT分页

技术问答 技术问答 219 人阅读 | 0 人回复 | 2023-09-14

好吧,所以基本上我DISTINCT通过使用变得无用ROW_NUMBER(),我需要避免这种情况,因为它会导致重复(当然,除了唯一的数字)!)
" Q3 U& V- y" b' ]# Y6 l& d因此,我想找的是一个查询,它将保持相同,但没有重复,因为num是唯一的:0 l9 H* W! c# s2 x
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,DateFROM 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修复可能很琐碎,但因为我不是SQL Server专家,所以我不习惯这些内部查询。- s- o5 }9 e4 A+ P7 |
更新:是的,是的,num用于分页。2 `# A" {$ r" P. R7 ~
                                                                2 F0 U( W! f) ~1 R) v* u
    解决方案:                                                                + K! P* v- p. D8 ], p4 G  y! @6 z
                                                                好像我最近的博客帖子大概是两年后我最近的博客帖子ROW_NUMBER()是到SELECT什么DENSE_RANK()是对SELECTDISTINCT。您的CTE必须更换为:
. p: |- k! g% ?( {( DWITH 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 ...在上述查询中,DENSE_RANK()的ORDERBY需要列出子句Original_Import和中所有列BASE_PROXY_VIEW_WITH_TARGET,以重现与DISTINCT关键字的顺序相同。这将为每个重复的记录集分配一个准确的等级,以便DISTINCT可以再工作。% p- s3 u& [' y! a: ^) y8 ^
在引用的博客文章中,我还包含了指向SQLFiddle在一个更简单的例子中解释了链接。
/ u" ?- b+ P: a' I* @# ^SELECT DISTINCT  v,  DENSE_RANK() OVER (w) row_numberFROM tWINDOW w AS (ORDER BY v)ORDER BY v,row_number
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则