具有按最大日期过滤掉的子句

时间:2013-01-11 15:23:33

标签: sql sql-server sql-server-2008 select sql-function

我正在尝试从“审核”表中获取area_id的最大日期,并仅返回那些最大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并且count应该是1(因为最大date_finished是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

3 个答案:

答案 0 :(得分:0)

您可以使用WHERE子句而不是HAVING

答案 1 :(得分: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

答案 2 :(得分: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