2013-01-11 56 views
0

我試圖從「查看」表中獲取area_id的最大日期,並只返回那些max_date_finished大於一年(從今天的日期起)的area_id。該表的結構是這樣的具有最大日期過濾出的子句

1) the 'review' table can have one or more reviews (multiple date_finished) for 
each area_id 
2) each region_id can have one or more area_ids 

目的:返回每REGION_ID評語數量與date_finished大於一年

的樣本數據:

region_id area_id date_finished 
abc   area_3 '01-01-2010 12:00:00 AM' 
abc   area_3 '06-01-2009 12:00:00 AM' 
abc   area_3 '02-01-2008 12:00:00 AM' 

預期的結果上面應該是返回區域abc和計數應該是1(因爲max_date_max是2010年1月1日並且大於今天的一年(2013)

我有以下的SQL。由於某種原因,它返回了我上面描述的所有日期。而不是返回最大日期它返回3日期。我正在使用SQL Server 2008.謝謝!

select count(*) 
from review group by area_id 
having datediff(day,max(date_finished), getdate()) > 365 
+0

是你列'date_finished' VARCHAR的數據類型( *字符串*)或日期? –

+0

因此,如果最大日期超過一年前,那麼COUNT的唯一有效值應該爲1,否則爲0。 – Lamak

+0

這是日期....我想我需要寫出整個日期 – dido

回答

0

我認爲你可以得到你想要的東西,通過聚合的兩個層次,第一個按地區和區域,第二個由區:

select r.region_id, count(*) as NumAreas, SUM(cnt) as NumReviews 
from (select r.region_id, r.area_id, count(*) as cnt, 
      MAX(date_finished)as maxDF 
     from review r 
     group by r.region_id, r.area_id 
    ) r 
where DATEDIFF(day, maxDF, getdate()) > 365 
group by r.region_id 
+0

是的!這正是我正在尋找的。特別是NumAreas。非常感謝!!! – dido

0

你可以使用WHERE子句而不是

0

你的問題是不是賺了很多道理給我。 您需要計算符合特定條件的最大日期。 該邏輯解析爲布爾值。 因爲滿足您的條件的日期要麼存在要麼沒有。

;WITH CTE (region_id, area_id, date_finished) AS 
( 
    SELECT 'abc',   'area_3', CAST('2010-1-1' AS DATETIME) UNION ALL 
    SELECT 'abc',   'area_3', '2009-3-1' UNION ALL 
    SELECT 'abc',   'area_3', '2008-6-1' 
) 
SELECT region_id 
     ,HasQualifyingVal = CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END 
FROM CTE 
WHERE date_finished < DATEADD(YEAR, 1, date_finished) 
GROUP BY region_id