如何根据另一个查找标准查询最后一个条目

时间:2017-06-20 12:25:05

标签: sql db2

我有一个历史记录表,用于在应用程序中的实体上注册事件。我正在寻找一个查询,如果在它之前只发生了另一个事件( A ),它会给我一个事件 B 的最新记录。

ENTITY_NO    EVENT    CREATE_DATE    PERSON_ID
EN10         B        2017-02-08     1234
EN10         A        2017-02-04     NULL
EN10         X        2017-01-24     NULL
EN10         Y        2017-01-22     NULL
EN10         Z        2017-01-19     NULL

例如,在上表中,我只想检索记录EVENT B ,并且只有在有EVENT A 的记录时才会检索记录EVENT B 发生在ENTITY_NO B (对于相同的gcloud)和其他记录之后。

我正在尝试在 DB2 11 中运行它。

3 个答案:

答案 0 :(得分:2)

您可以使用lead()lag()

select t.*
from (select t.*,
             lag(event) over (partition by entity_no order by date) as prev_event,
             lead(event) over (partition by entity_no order by date) as next_event
      from t
     ) t
where event = 'B' and prev_event = 'A' and next_event is null

答案 1 :(得分:1)

其他方法:

with tablewithrank as (
select f0.*, rownumber() over(partition by f0.ENTITY_NO order by f0.CREATE_DATE) rang 
from yourtable f0
)
select * from tablewithrank f1
inner join tablewithrank f2 on (f1.ENTITY_NO, f1.rang-1)=(f2.ENTITY_NO, f2.rang) and f2.EVENT='A'
left outer join tablewithrank f3 on (f1.ENTITY_NO, f1.rang+1)=(f3.ENTITY_NO, f3.rang)
where  f1.EVENT='B' and f3.ENTITY_NO is null 

答案 2 :(得分:0)

如果您的DB2版本没有Lag and Lead功能,您可以这样做:

select * from yourtable f1

inner join lateral
(
  select * from yourtable f0
  where f0.ENTITY_NO=f1.ENTITY_NO and f0.CREATE_DATE<f1.CREATE_DATE 
  order by f0.CREATE_DATE desc
  fetch first rows only       
) f2 on 1=1

left outer join lateral
(
  select * from yourtable f0
  where f0.ENTITY_NO=f1.ENTITY_NO and f0.CREATE_DATE>f1.CREATE_DATE 
  fetch first rows only       
) f3 on 1=1 

where f1.EVENT='B' and f2.EVENT='A' and f3.ENTITY_NO is null