SQL条件行号重置

问题描述 投票:0回答:1

假设我有以下用户操作。我正在寻找接受XX型文档的最古老的不间断操作。

  1. 删除动作将认为是打扰
  2. 如果用户已经接受XX但随后接受A。它将被打断。

我实际上是在寻找接受XX的班轮行动,但它必须是最旧的,每当删除XX时,我们都需要重置基线。

T11是预期的结果。

EVENTTIME    ACTION      DOCUMENTTYPE   
T1           Accept      A
T2           Accept      XX
T3           Delete      A
T4           Accept      A
T5           Accept      XX
T6           Accept      XX
T7           Delete      A
T8           Accept      A
T9           Accept      XX
T10          Accept      A
T11          Accept      XX
T12          Accept      XX
T13          Accept      XX

注意:

  1. T2不是结果,因为T3中断了时间轴。
  2. T5不是结果,因为T7中断了时间轴。
  3. 不是T9的结果,因为T10接受A中断了班轮XX的接受。
  4. T11是结果,因为在上述时间轴重置之后。这是XX最早的认可。

我正在考虑行号加上额外的分组(累积和)查询解决方案。有什么想法吗?

sql oracle sum window-functions row-number
1个回答
0
投票
select min(eventtime) from t where not exists (select 1 from t t2 where t2.eventtime > t.eventtime and t2.DOCUMENTTYPE <> 'XX' );

另一种有趣的方法窗口功能:

select min(eventtime)
from (select t.*,
             row_number() over (order by eventtime desc) as seqnum,
             row_number() over (partition by documenttype order by eventtime desc) as seqnum_dt
      from t
     ) t
where documenttype = 'XX' and
      seqnum = seqnum_dt;
© www.soinside.com 2019 - 2024. All rights reserved.