[英]SQL query group where one column is missing specific data
我有一個 Oracle SQL 數據庫,其中包含訂單簿信息,例如
訂單號 | 時間戳 | 手術 | 訂單狀態 | ... |
---|---|---|---|---|
1個 | 00:00:01 | 插入 | 新的 | ... |
1個 | 00:00:05 | 更新 | 部分填充 | ... |
2個 | 00:00:07 | 更新 | 部分填充 | ... |
1個 | 00:00:08 | 取消 | 填充 | ... |
3個 | 00:00:08 | 插入 | 新的 | ... |
現在,此數據並不總是完美填充,因為有時會有缺少信息的 order_ids。
我試圖確定的一個這樣的問題是缺少操作“插入”的訂單(因此,所有具有相同 order_ID 的訂單),例如,有些 order_ids 具有操作“更新”或“取消”,但不是“插入'。 在上面的示例表中,order_id 2 就是這種情況(它有一個“更新”,但沒有“插入”)
我能夠通過僅下載整個數據集並使用 Python 分析數據來執行此分析,但如果可能的話,我希望能夠通過直接 SQL 查詢(更快)執行此操作。
查看以下內容是否有幫助:
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;
輸出:
訂單號 |
---|
2個 |
或者,如果您想要組中UPDATE
或CANCEL
操作最先出現的組,那么您可以使用:
SELECT order_id
FROM order_book
MATCH_RECOGNIZE(
PARTITION BY order_id
ORDER BY timestamp
PATTERN ( ^ (update_op|cancel_op) )
DEFINE
update_op AS operation = 'UPDATE',
cancel_op AS operation = 'CANCEL'
);
哪個輸出相同。
您可以使用條件聚合來檢查某些狀態是否與其他狀態一起存在。
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
對於您的樣本數據,它返回
訂單號 |
---|
2個 |
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.