2014-01-29 58 views
2

我有一個表叫做位置,看起來像這樣SQL - 僅在最大日期選擇唯一名稱?

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(日期),即2014年1月1日和那裏是隻有1行這個名稱和日期是MAX(日期)

爲了進一步解釋我想回

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

我試圖像HAVING聲明幾個疑問,但似乎無法得到期望的結果

回答

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,它只有一個入口是表中最新的日期。

(這是基於這樣的假設每個位置只能每天一個條目)

+0

,如果它與同日兩行這將返回的位置。不清楚這是否可能,但會在'HAVING'中包含一個'COUNT(1)= 1'作爲完整性。 –

+0

我沒有想到使用MIN(ImportDate),好動!謝謝效果很好 – DtotheG

+0

@JonEgerton - 我正在考慮是否要補充一點,作爲我的一個明確的假設 –

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 
+0

這也行得通,第一個選項稍微簡單一些,所以隨之而來,但是感謝這裏的輸入! – DtotheG

+0

@支持G謝謝您的確認!對你的問題+1! :) – DhruvJoshi

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

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 
相關問題