Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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-仅按最大日期选择唯一名称?_Sql_Sql Server 2008_Sql Server 2008 R2 - Fatal编程技术网

SQL-仅按最大日期选择唯一名称?

SQL-仅按最大日期选择唯一名称?,sql,sql-server-2008,sql-server-2008-r2,Sql,Sql Server 2008,Sql Server 2008 R2,我有一张名为Locations的表,看起来像这样 Name Date Location A 01/01/2014 Location A 12/12/2013 Location B 01/01/2014 Location C 01/01/2014 Location D 01/01/2014 Location D 12/12/2013 Location E 12/12/2013 我只想返回日期为MAX(date)的名称,即2014年1月1日,该名称只有一行,日期为MAX(date) 为

我有一张名为Locations的表,看起来像这样

Name       Date
Location A 01/01/2014
Location A 12/12/2013
Location B 01/01/2014
Location C 01/01/2014
Location D 01/01/2014
Location D 12/12/2013
Location E 12/12/2013
我只想返回日期为MAX(date)的名称,即2014年1月1日,该名称只有一行,日期为MAX(date)

为了进一步解释,我想返回

Name       Date
Location B 01/01/2014
Location C 01/01/2014
我尝试了一些查询,如HAVING语句,但似乎无法获得所需的结果这似乎有效:

declare @t table (Name varchar(49), [Date] date)
insert into @t(Name,[Date]) values
('Location A','20140101'),
('Location A','20131212'),
('Location B','20140101'),
('Location C','20140101'),
('Location D','20140101'),
('Location D','20131212'),
('Location E','20131212')

select Name,MAX(Date)
from @t
group by Name
having MIN(Date) = (select MAX(Date) from @t)
在这里使用哪种聚合并不重要:

select Name,MAX(Date)
前提是对日期的引用是聚合的

结果:

Name                                              
------------------------------------------------- ----------
Location B                                        2014-01-01
Location C                                        2014-01-01
逻辑是-如果特定
名称
的最早日期也是整个表的最晚日期,那么逻辑上该
名称
只有一个条目,它是表中的最晚日期


(这是基于每个位置每天只能有一个条目的假设)

我们可以先在内部查询中使用
分组依据
计数
检查不重复的名称,然后将该名称与原始表进行
内部联接
并在原始表上按名称和日期分组,以计算最大值日期和相应的名称

SELECT t.Name, MAX(Date) From table INNER JOIN 
(SELECT DISTINCT Name from table group by Name having count(Name)=1) t 
ON t.name=table.name
GROUP BY Date,t.Name

易于遵循的逻辑版本:

select name,date = max(date)
from Locations
group by name
having max(date) = (select max(date) from Locations)
and count(1) = 1

如果有两行日期相同,则返回一个位置。不清楚这是否可行,但为了完整起见,将在
中包含一个
和COUNT(1)=1
。我没有想到使用MIN(ImportDate),这是个好主意!谢谢工作well@JonEgerton-我正在考虑是否添加这一点,作为我的一部分的明确假设这也起作用,第一个选项稍微容易一些,所以就这样做了,但感谢这里的输入@谢谢你的确认+1.回答你的问题!:)
declare @t table (Name varchar(49), [Date] date)
insert into @t(Name,[Date]) values
('Location A','20140101'),
('Location A','20131212'),
('Location B','20140101'),
('Location C','20140101'),
('Location D','20140101'),
('Location D','20131212'),
('Location E','20131212')

select Name, [Date] from
(
select Name,[Date], 
maxdate =  max([Date]) over ( ),
Cnt =  count(*) over ( PARTITION by Name )
from @t
) Res
where [Date] = maxdate
and cnt = 1