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_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
4

3 回答 3

0

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

于 2013-01-11T15:42:05.340 回答
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
于 2013-01-11T15:42:39.693 回答
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
于 2013-01-11T15:47:49.187 回答