簡體   English   中英

SQL 查詢組其中一列缺少特定數據

[英]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進行逐行模式匹配,判斷UPDATECANCEL操作之前是否有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個

或者,如果您想要組中UPDATECANCEL操作最先出現的組,那么您可以使用:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM