我在 Oracle sql 資料庫中有一個“佇列”表,其中 ID 在某個日期輸入,并且每天都有一個條目/行,直到它們離開為止。這些 ID 可以回傳多次。每次他們有連續的日期/行,直到他們離開。
突出顯示的日期顯示 ID 退出表格的時間:

我需要一個每次 ID 離開時輸出的查詢:

我正在處理以下查詢,Split 欄位作為處理周末或節假日丟失資料的最少天數。如果 ID 僅離開表格 1-5 天,我不希望 5 天或更短的時間觸發“退出日期”。
SELECT
Account_Number
, SPLIT
, MIN(Dt) AS end_date
from(
SELECT Account_Number
, Dt
, LEAD (Dt) OVER (ORDER BY Account_Number,Dt) as next_dt
, case when LEAD (Dt) OVER (ORDER BY Account_Number,Dt) - Dt > 5 then 1 else 0 end as DaysDiff
, LEAD (Dt) OVER (ORDER BY Account_Number,Dt) - Dt as split
from tablename
)
WHERE split > 5
and Account_Number = '123'
GROUP BY Account_Number, SPLIT
問題是現在的查詢只輸出前兩個日期。它錯過了 ID 離開表格的第三次也是最后一次。
uj5u.com熱心網友回復:
從 Oracle 12 開始,您可以使用MATCH_RECOGNIZE來執行逐行處理:
SELECT *
FROM table_name
MATCH_RECOGNIZE(
PARTITION BY account_number
ORDER BY dt
MEASURES
LAST(dt) AS leave_dt
PATTERN (consecutive_dt* last_dt)
DEFINE
consecutive_dt AS NEXT(dt) <= dt INTERVAL '5' DAY
);
其中,對于樣本資料:
CREATE TABLE table_name (account_number, dt) AS
SELECT 123, DATE '2022-02-18' LEVEL - 1 FROM DUAL CONNECT BY LEVEL <= 11 UNION ALL
SELECT 123, DATE '2022-03-19' LEVEL - 1 FROM DUAL CONNECT BY LEVEL <= 3 UNION ALL
SELECT 123, DATE '2022-04-16' LEVEL - 1 FROM DUAL CONNECT BY LEVEL <= 18;
輸出:
帳號 離開_DT 123 2022-02-28 00:00:00 123 2022-03-21 00:00:00 123 2022-05-03 00:00:00
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/497749.html
上一篇:oracle如何查詢
下一篇:多個連接顯示學生課程名稱
