我有一个名为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语句的查询,但似乎无法获得所需的结果
答案 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 BY
和COUNT
检查不重复的名称,然后使用原始表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
答案 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