什么脚本会返回所需的最终表?

时间:2014-05-14 11:18:30

标签: sql sql-server tsql sql-server-2000

在下表中,哪个脚本每个CARE_ID返回一行,其EVENT_TYPE为CP,它位于TR的第一个实例之前。否则返回最新的CP实例。优先级比较器为EVENT_DATE,并列断路器为MAX(EVENT_ID) 以下是预期的决赛桌。

CARE_ID     EVENT_ID    EVENT_DATE          EVENT_TYPE
3           117         09/04/2010 00:00    CP
3           104         11/04/2010 00:00    TR
3           190         16/04/2010 00:00    TR
3           16          12/07/2010 00:00    TR
3           17          13/07/2010 00:00    TR
3           18          13/07/2010 00:00    TR
78          11          27/07/2009 00:00    TR
78          9           28/07/2009 00:00    TR
78          706         08/12/2010 00:00    CP
78          707         09/12/2010 00:00    CP
107         93          23/02/2010 00:00    CP
107         1474        21/09/2012 00:00    TR
206         84          28/07/2009 00:00    CP
206         85          21/08/2009 00:00    CP


CARE_ID     EVENT_ID    EVENT_DATE          EVENT_TYPE
3           117         09/04/2010 00:00    CP
78          707         09/12/2010 00:00    CP
107         93          23/02/2010 00:00    CP
206         85          21/08/2009 00:00    CP

1 个答案:

答案 0 :(得分:1)

这种类型的查询应该是可行的。以下内容根据您的条件获取最长活动日期:

select t.care_id,
       coalesce(max(case when event_date < tr.mined then event_date end),
                max(event_date)
               ) as thedate
from table t left outer join
     (select care_id, min(event_date) mined
      from table t
      where event_type = 'TR'
      group by care_id
     ) tr
     on tr.care_id = t.care_id
where t.event_type = 'CP'
group by t.care_id;

然后,您可以加入原始表格以获取其余信息:

select t.*
from table t join
     (select t.care_id,
             coalesce(max(case when event_date < tr.mined then event_date end),
                      max(event_date)
                     ) as thedate
      from table t left outer join
           (select care_id, min(event_date) mined
            from table t
            where event_type = 'TR'
            group by care_id
           ) tr
           on tr.care_id = t.care_id
      where t.event_type = 'CP'
      group by t.care_id
     ) tt
     on tt.care_id = t.care_id and tt.thedate = t.event_date and tt.event_type = 'CP';