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

时间:2014-01-29 11:21:17

标签: 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(日期)的名称,即01/01/2014,此名称只有1行,日期为MAX(日期)

进一步解释我想返回

Name       Date
Location B 01/01/2014
Location C 01/01/2014

我尝试了一些像HAVING语句的查询,但似乎无法获得所需的结果

4 个答案:

答案 0 :(得分:4)

这似乎有效:

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)

如果对Date的引用是聚合的。

结果:

Name                                              
------------------------------------------------- ----------
Location B                                        2014-01-01
Location C                                        2014-01-01

逻辑是 - 如果特定Name最早日期也是整个表的最新日期,那么逻辑上只有一个条目这是Name,它是表格中的最新日期。

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

答案 1 :(得分:1)

我们可以首先使用内部查询中的GROUP BYCOUNT检查不重复的名称,然后使用原始表inner join检查这个名称,我们按名称和日期对其进行分组计算最大值日期和相应名称

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

答案 2 :(得分:0)

易于遵循逻辑版本:

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

SQL Fiddle here

答案 3 :(得分:0)

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