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_Tsql_Distinct - Fatal编程技术网

是否从SQL Server表中选择具有最大日期的不同行?

是否从SQL Server表中选择具有最大日期的不同行?,sql,sql-server,tsql,distinct,Sql,Sql Server,Tsql,Distinct,我需要为一个表获取一组不同的记录,以及所有副本的最大日期 例: 问题是我要为每个不同的日期找回一份记录 例: 我如何限制这一点,使我最终只得到: aaa, bbb, ccc Jan 28 2009 我想问题是戈尔比和明显的不好相处 编辑:找到导致问题的问题,查询结果与预期一致,而不是如上所述。您的查询或示例结果有问题,因为您所描述的不可能。一些实际的SQL和实际结果如何 在任何情况下,您都不需要在那里使用distinct,因为您所选择的只是三个分组的列和一个聚合,因此根据定义,您将得到所有不同

我需要为一个表获取一组不同的记录,以及所有副本的最大日期

例:

问题是我要为每个不同的日期找回一份记录

例:

我如何限制这一点,使我最终只得到:

aaa, bbb, ccc Jan 28 2009
我想问题是戈尔比和明显的不好相处


编辑:找到导致问题的问题,查询结果与预期一致,而不是如上所述。

您的查询或示例结果有问题,因为您所描述的不可能。一些实际的SQL和实际结果如何

在任何情况下,您都不需要在那里使用
distinct
,因为您所选择的只是三个分组的列和一个聚合,因此根据定义,您将得到所有不同的行。我从未尝试过这一点,所以在使用这两种方法时,可能会有一些不当行为。您是否尝试过删除不同的
?你为什么把它放在那里

WITH q AS (
        SELECT  abc.*, ROW_NUMBER() OVER (PARTITION BY a, b, c ORDER BY orderDate DESC) AS rn
        FROM    abc
        )
SELECT  *
FROM    q
WHERE   rn = 1
(a、b、c、orderDate)
(按此顺序)上建立索引将大大改进此查询。

如果运行此查询:

select 'ab' as Col1, 'bc' as col2, 'cd' as col3, getdate() as Date
into #temp
insert into #temp
values ('ab','bc','cd','1/15/09')
insert into #temp
values ('aa','bb','cc','1/1/09')
insert into #temp
values ('aa','bb','cc','1/22/09')

select col1,col2,col3,max(date)
from #temp
group by col1,col2,col3
你应该回去:

aa,bb,cc,2009-01-22 00:00:00.000
ab,bc,cd,2009-04-30 09:23:07.090


您的查询也会起作用,因此确实有问题,或者您没有正确地传达代码的确切性质

这似乎是一种低效的方法,通过分组来完成同样的事情,除非我的大脑不工作。我在这里遗漏了什么?假设有一个索引,它的效率与GROUP BY相同,但会选择所有列,而不仅仅是GROUP BY中使用的列。原始问题要求提供一套“记录”。我想我错过了作者的意思。有趣的是,我没有意识到排名函数的运行效率与分组相同。这是因为您使用的是“分区依据”而不是“排序依据”吗?我以前从未见过这个短语。很高兴知道!原来是另一个问题导致了这个问题。结果不是我所期望的。抱歉。请关闭您的问题,因为它与您的问题无关。谢谢你怎么了?很好,你找到了解决方案,更多的人也需要它,因为在我看来+1是最正确的答案。我必须承认,我对卡斯努伊对你评论的反应很好奇。他的技术是毋庸置疑的,所以我现在认为我们肯定错过了什么。
WITH q AS (
        SELECT  abc.*, ROW_NUMBER() OVER (PARTITION BY a, b, c ORDER BY orderDate DESC) AS rn
        FROM    abc
        )
SELECT  *
FROM    q
WHERE   rn = 1
select 'ab' as Col1, 'bc' as col2, 'cd' as col3, getdate() as Date
into #temp
insert into #temp
values ('ab','bc','cd','1/15/09')
insert into #temp
values ('aa','bb','cc','1/1/09')
insert into #temp
values ('aa','bb','cc','1/22/09')

select col1,col2,col3,max(date)
from #temp
group by col1,col2,col3