我有一个历史记录表,用于在应用程序中的实体上注册事件。我正在寻找一个查询,如果在它之前只发生了另一个事件( 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 中运行它。
答案 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