0

「レビュー」テーブルから area_id の最大日付を取得しようとしており、(今日の日付から) 1 年を超える最大 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

目的: 1 年以上の date_finished を持つ region_id ごとのレビューの数を返します

サンプルデータ:

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) から 1 年よりも大きいため)

私が持っている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

HAVINGの代わりにWHERE句を使用できます

于 2013-01-11T15:42:05.340 に答える
0

最初は地域とエリア別、2 つ目は地域別の 2 つのレベルの集計を通じて、必要なものを取得できると思います。

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 に答える
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 に答える