Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server不同分页,行号()不不同_Sql_Sql Server_Pagination_Distinct - Fatal编程技术网

SQL Server不同分页,行号()不不同

SQL Server不同分页,行号()不不同,sql,sql-server,pagination,distinct,Sql,Sql Server,Pagination,Distinct,好的,所以基本上我的DISTINCT通过使用行数()变得无用,我需要避免这种情况,因为它会导致重复的结果(当然除了唯一的num!) 因此,我要寻找的是一个查询,它的工作方式相同,但没有重复的行,因为num是唯一的: WITH t AS ( SELECT DISTINCT *, ROW_NUMBER() OVER (ORDER BY Date) AS num FROM Original_Import LEFT JOIN eqcas.dbo.BASE_PROXY_VIEW_WI

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

因此,我要寻找的是一个查询,它的工作方式相同,但没有重复的行,因为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
修复这个问题可能相当简单,但鉴于我不是SQL Server人员,我不习惯这些内部查询等等


更新:是的,num用于分页。对此信心有限,因为我无法测试甚至编译,但这是我所想的一般要点

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

我最近在博客上发表了一篇关于这个问题的博文,似乎已经晚了两年。您的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 ...
在上面的查询中,
densite\u RANK()
ORDER BY
子句将需要列出
原始导入
基本代理视图中带有目标
的所有列,以重现与
DISTINCT
关键字相同的顺序。这将为每个重复记录集分配一个秩,这样
DISTINCT
将再次工作

在本文中,我还包括了一个链接,指向一个更简单的示例中的示例

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

.

你对语法有什么想法吗?那会怎么样?记住我不知道MSSQL!请参阅下面的内容并尝试。现在我想我没有完全理解你。您需要以正确的方式对行进行编号,这样您的CTE就不会像预期的那样工作?0和20之间的
是静态的,还是用于分页结果?我所能做的就是在上执行一个子查询,T作为先执行distinct,然后在distinct处理后添加行号。。。我会研究语法,但我不接近SQL atm。。。但这似乎是缓慢的……缓慢不是一个问题:)这听起来是正确的解决方案。谁能提供语法?由于我来自mysql背景,从未使用过内部查询,所以我很难处理它们。也许有更简单的方法可以做到这一点,但我认为考虑到目前的情况,这是最好的答案,原因如下:1。我理解它是如何工作的。它工作得很好。我有信心它不会搞砸其他任何事情。事实上,作为旁白,这里最里面的查询实际上并没有返回唯一的结果集,但是通过选择我需要的结果(就像查询中的最后一个查询),它就起作用了。@JohnHunt:有点晚了,但可能是一个合适的选择,在这里,你可能迟了两年才给出答案,但我又晚了一年才得到有用的答案。非常感谢你好,卢卡塞德,谢谢你的精彩帖子!,您如何将(除以1)上的
COUNT(*)等内容与
densite\u-RANK
合并?@epoch:不太清楚您的意思。你想统计不同的记录吗?即删除重复项后留下的记录?(这可能最好用一个新的堆栈溢出问题来回答)@LukasEder,谢谢你的回答,lukas,我通过问一个新问题来解决它:)几年后,我把这个问题改成了公认的答案。感谢所有做出贡献的人。从那以后我换了几次雇主,哈哈。