1

我正在尝试计算每个人在特定目标日期的前一年和后一年的事件(即 event_table 中的行)。例如,假设我有一个人 100,目标日期是 10/01/2012。我想计算 9/30/2011-9/30/2012 和 10/02/2012-9/30/2013 的事件。

我的查询看起来像:

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 server 语法。

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 回答