我有一个由订单信息组成的Oracle SQL数据库,例如
<表类>
ORDER_ID
时间戳
操作
ORDER_STATUS
…
tbody><<tr>1 00:00:01 插入 新 … 100:00:05 更新 部分填写 … 200:00:07 更新 部分填写 … 100:00:08 取消 填写 … 3 00:00:08 插入 新 … 表类>
您可以使用条件聚合来检查某些状态是否与其他状态同时存在。
select order_id
from sample
where operation in ('INSERT', 'UPDATE', 'CANCEL', 'OTHER_STATUS_TO_CHECK_TOGETHER_WITH_INSERT')
group by order_id
having count(case operation when 'INSERT' then 1 end) = 0
对于示例数据,它返回
ORDER_ID
看看下面是否有帮助:
Select Order_Id
from t
where Operation in ('UPDATE','CANCEL')
and not exists (
select * from t t2
where t2.Order_Id = t.Order_Id and t2.Operation = 'INSERT'
);
从Oracle 12开始,您可以使用MATCH_RECOGNIZE
执行逐行模式匹配,以确定UPDATE
或CANCEL
操作之前是否有INSERT
操作:
SELECT order_id
FROM order_book
MATCH_RECOGNIZE(
PARTITION BY order_id
ORDER BY timestamp
MEASURES
COUNT(insert_op.operation) AS has_insert
PATTERN ( insert_op? (update_op|cancel_op)+ )
DEFINE
insert_op AS operation = 'INSERT',
update_op AS operation = 'UPDATE',
cancel_op AS operation = 'CANCEL'
)
WHERE has_insert = 0;
对于样本数据:
CREATE TABLE order_book (ORDER_ID, TIMESTAMP, OPERATION, ORDER_STATUS ) AS
SELECT 1, '00:00:01', 'INSERT', 'New' FROM DUAL UNION ALL
SELECT 1, '00:00:05', 'UPDATE', 'Partially Filled' FROM DUAL UNION ALL
SELECT 2, '00:00:07', 'UPDATE', 'Partially Filled' FROM DUAL UNION ALL
SELECT 1, '00:00:08', 'CANCEL', 'Filled' FROM DUAL UNION ALL
SELECT 3, '00:00:08', 'INSERT', 'NEW' FROM DUAL;
输出:
ORDER_ID