1

各人の特定の目標日の前年と翌年のイベント(event_tableの行)をカウントしようとしています。たとえば、人が100人いて、目標日が2012年10月1日であるとします。2011年9月30日から2012年9月30日までと2012年10月2日から2013年9月30日までのイベントをカウントしたいと思います。

私のクエリは次のようになります。

select * 
from (
    select id, target_date
    from subsample_table
    ) as i
left join (
   select id, event_date, count(*) as N
        , case when event_date between target_date-365 and target_date-1 then 0 
               when event_date between target_date+1 and target_date+365 then 1
               else 2 end as after 
   from event_table
   group by id, target_date, period
   ) as h
on   i.id = h.id 
 and i.target_date = h.event_date

出力は次のようになります。

id  target_date  after  N
100 10/01/2012   0      1000
100 10/01/2012   1      0    

期間の前後(または両方)にイベントが発生しない人もいる可能性があります。その場合はゼロを設定すると便利です。730日以外のイベントは気にしません。

任意の提案をいただければ幸いです。

4

2 に答える 2

2

次のことがあなたが達成しようとしていることに近づくかもしれないと思います。

   select id
         , target_date
         , event_date
         , count(*) as N
         , SUM(case when event_date between target_date-365 and target_date-1 
                    then 1
                    else 0
                end) AS Prior_ 
         , SUM(case when event_date between target_date+1 and target_date+365 
                    then 1
                    else 0
               end) as After_              
      from subsample_table i
      left join 
           event_table h
        on i.id = h.id 
       and i.target_date = h.event_date
     group by id, target_date, period
于 2013-02-08T14:08:33.870 に答える
0

これは一般的な答えです。teradataの日付関数がわからないので、SQLサーバーの構文を使用します。

select id, target_date, sum(before) before, sum(after) after, sum(righton) righton
from yourtable t
join (
select id, target_date td
, case when yourdate >= dateadd(year, -1, target_date) 
  and yourdate < target_date then 1 else 0 end before
, case when yourdate <= dateadd(year, 1, target_date) 
  and yourdate > target_date then 1 else 0 end after
, case when yourdate = target_date then 1 else 0 end righton

from yourtable
where whatever 
group by id, target_date) sq on t.id = sq.id and target_date = dt
where whatever
group by id, target_date

この回答は、IDに複数のターゲット日付を含めることができることを前提としています。

于 2013-02-08T01:09:55.850 に答える