sql - 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 代码?
解决方案
这是使用窗口函数的一种方法:
- 找到有三个批准的第一行。
- 在三个批准的行中找到最小的 action_at
- 筛选
- 保留你想要的三行
此版本使用fetch
Oracle 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;
推荐阅读
- mysql - SQL 用户订购了 n 件以上的产品
- wordpress - add_action 在条件外有效,但不在条件内
- c# - 反序列化枚举 C#
- sql - 如何在需要拆分的字段上执行连接?
- ibm-midrange - 如何在 Windows 10 中更改 AS400 / IBM 的背景颜色?
- python - Odoo8 - 通过给定的用户和数据范围从 Python 生成报告
- node.js - 是否可以从 serverless.yml 生成 expressJS 应用程序?
- bash - 在某些情况下通过过滤器管道输入的bash函数,否则将输入通过不变
- graphql - 不同 GraphQL 指令的说明
- azure-devops - 无法从其他项目签出 repos