首页 > 解决方案 > Oracle SQL - 在特定行之后选择最后 3 行

问题描述

以下是我的数据:

在此处输入图像描述

我的要求是获得前3个连续批准。所以从上面的数据中,ID 4、5 和 6 是我需要选择的行。ID 1 和 2 不符合条件,因为 ID 3 是拒绝,因此会破坏操作的连续条件。基本上,我正在寻找列表中的最后一个拒绝,然后找到之后的 3 个连续批准。

此外,如果在操作链中没有拒绝,那么前 3 个操作应该是结果。对于以下数据:

在此处输入图像描述

所以我的输出应该是 ID 11、12 和 13。

如果批准少于 3 个,则输出应该是批准列表。对于以下数据:

在此处输入图像描述

输出应为 ID 21 和 22。

有没有办法只用 SQL 查询来实现这一点 - 即没有 PL-SQL 代码?

标签: sqloracle

解决方案


这是使用窗口函数的一种方法:

  • 找到有三个批准的第一行。
  • 在三个批准的行中找到最小的 action_at
  • 筛选
  • 保留你想要的三行

此版本使用fetchOracle 12+ 中的版本:

select t.*
from (select t.*,
             min(case when has_approval_3 = 3 then action_at end) over () as first_action_at
      from (select t.*,
                   sum(case when action = 'APPROVAL' then 1 else 0 end) over (order by action_at rows between current row and 2 following) as has_approval_3
            from t
           ) t
     ) t
where action = 'APPROVAL' and
      (action_at >= first_action_at or first_action_at is null)
order by action_at
fetch first 3 rows only;

推荐阅读