加入历史记录表以获取特定时间的最新事件

时间:2013-12-11 17:48:10

标签: sql oracle join

我正在使用Oracle 10g。

我希望自己加入history表,以获取所有事件的特定类型事件的最新时间。例如,我在时间戳3,我想知道最后一个时间戳事件E何时发生。

以下是示例history表和所需的输出:

ID TS EVENT   ID TS OCC
-----------   ---------
A  1          A  1  null    
A  2  E       A  2  2
A  3  E       A  3  3
A  4          A  4  3
A  5          A  5  3
A  6  E       A  6  6
A  7          A  7  6
B  1  E       B  1  1 
B  2          B  2  1
B  3          B  3  1
B  4          B  4  1

请注意,“历史记录”对于每个实体都是独立的(标有ID)。

我想这样做:

select history h1
left outer join
history h2
on h1.ID = h2.ID and h2.event='E' and h2.TS = 
    (
        select 
            max(TS)
        from 
            history h3 
        where 
            h3.task_id = h.task_id and
            h3.created_ts < h.created_ts and
            h3.event = 'E'
    )

但甲骨文不会让我,它说:

ORA-01799: a column may not be outer-joined to a subquery

对于这个问题,我将不胜感激。

1 个答案:

答案 0 :(得分:4)

试试这个:

SELECT t.id,
       t.ts,
       t.event,
       MAX( case event when 'E' then ts end )
        OVER
       ( Partition by id order by ts 
         rows between unbounded preceding and current row ) occ
FROM history t
;

演示 - &gt; http://www.sqlfiddle.com/#!4/50170/2
该查询应适用于Oracle 10.2及更高版本。