2014-11-03 67 views
1

我有一个表(称之为OBJ_EVENTS)是这样的:如何从内部查询中选择第一条记录?

EVENT_ID OBJ_ID  EVENT_DATE  EVENT_TYPE 

500   1   10/10/2010  FOO 
497   1   01/05/2011  BAR 
714   1   01/06/2011  BAZ 
1700  2   01/01/2012  FOO 
57   2   08/09/2012  BAR 
12   2   08/10/2010  BAZ 

重要提示 - 我EVENT_ID没有下令

而且我想执行一个SQL查询来显示时间这样FOO事件和巴事件之间的区别:

OBJ_ID  FOO_TIME  BAR_TIME 

1   10/10/2010 01/05/2011 
2   01/01/2012 08/09/2012 

当我最初写这个查询,我EVENT_ID受命,所以我做了这样的事情:

SELECT E1.OBJ_ID, 
     E1.EVENT_DATE AS FOO_TIME, 
     E2.EVENT_DATE AS BAR_TIME 
    FROM OBJ_EVENTS E1 
    JOIN OBJ_EVENTS E2 
    ON (E2.EVENT_ID = (SELECT MIN(EVENT_ID) 
         FROM OBJ_EVENTS E3 
         WHERE E3.OBJ_ID = E1.OBJ_ID 
          AND E3.EVENT_DATE >= E1.EVENT_DATE 
          AND E3.EVENT_TYPE = 'BAR')) 

然而,由于其他项目的限制,我不会进入,我EVENT_ID不再按年代顺序排列,因此该查询不起作用。我也尝试了order by E3.EVENT_DATE并选择row_number()= 1的位置,但这也不起作用。 Oracle引发错误。

帮助!!!

+1

你可以做一个分(E3.EVENT_DATE) – 2014-11-03 18:08:11

回答

1

所以你想要FOO事件和他们后来的BAR事件。试试“领先”分析函数来获取后续的BAR。

select event_type, next_type, event_date, next_date, next_date - event_date from (
    select obj_id, event_date, event_type, 
     lead(event_type) over (partition by obj_id order by event_date) next_type, 
     lead(event_date) over (partition by obj_id order by event_date) next_date 
    from 
    event_test 
    where event_type in ('FOO', 'BAR') 
) where event_type = 'FOO' and next_type='BAR' 

会给你这样的:FOO和BAR事件

1 1 FOO BAR 10/10/2010 1/5/2011 87 
2 2 FOO BAR 1/1/2012 8/9/2012 221 
1

如果只有一个foo的事件,每一个obj_id酒吧事件,然后将查询过于复杂:

select ef.obj_id, ef.event_date as event_date_foo, eb.event_date as event_date_bar 
from obj_events ef join 
    obj_events eb 
    on ef.obj_id = eb.obj_id and 
     ef.event_type = 'FOO' and 
     eb.event_type = 'BAR'; 

如果有多次出现,你需要决定你想要的。这一次得到第一次出现对每个:

select e.obj_id, 
     min(case when e.event_type = 'FOO' then event_date end) as event_date_foo, 
     min(case when e.event_type = 'BAR' then event_date end) as event_date_bar 
from obj_events e 
group by e.obj_id; 

我假设你知道如何利用的日期的不同,因为你已经有一个曾经工作过的查询。

+0

在我的数据库,有可能是整个流。我需要为每个FOO显示下一个最接近的BAR的时间。 – 2014-11-03 18:14:06

+0

你的第二个建议不适用于我,因为我需要加入obj_events表,因此我可以对日期进行算术运算。 – 2014-11-03 19:13:02

相关问题