有 1 個表,其中為 1 名員工維護所有這些記錄。由于此表中還有一列未在本示例中顯示,因此該人即使是 1 個作業也有多行,即作業 J1 有 2 行,作業 J2 有 3 行,作業 J1 又是 2 行。該人從作業 J1 切換到 J2,然后再切換到 J1。如何在發生切換時提取所需的行,因為我必須在作業更改時提取每行的最大值。我在主查詢的子查詢中使用 group by 來提取行,但是如果該人在換回 J2 后切換回相同的作業 J1,則它不起作用,因為它將 J1 中的所有作業都處理在一個不正確的組中。請幫我。
StDt EdDt Job Required_Rows
1-Jan-21 31-Jan-21 J1 N
1-Feb-21 30-Jun-21 J1 Y
1-Jul-21 30-Jul-21 J2 N
1-Aug-21 15-Aug-21 J2 N
16-Aug-21 31-Aug-21 J2 Y
1-Sep-21 1-Nov-21 J1 N
2-Nov-21 31-Dec-21 J1 Y
uj5u.com熱心網友回復:
從 Oracle 12 開始,您可以使用MATCH_RECOGNIZE:
SELECT *
FROM table_name
MATCH_RECOGNIZE(
ORDER BY stDt
ALL ROWS PER MATCH
PATTERN ({- same* -} same )
DEFINE
same AS FIRST(job) = job
);
在早期版本中,您可以使用LEAD決議函式:
SELECT StDt,
EdDt,
Job
FROM (
SELECT t.*,
LEAD(job) OVER (ORDER BY StDt) AS next_job
FROM table_name t
)
WHERE next_job IS NULL
OR next_job != job;
其中,對于樣本資料:
CREATE TABLE table_name (StDt, EdDt, Job) AS
SELECT DATE '2021-01-01', DATE '2021-01-31', 'J1' FROM DUAL UNION ALL
SELECT DATE '2021-02-01', DATE '2021-06-30', 'J1' FROM DUAL UNION ALL
SELECT DATE '2021-07-01', DATE '2021-07-31', 'J1' FROM DUAL UNION ALL
SELECT DATE '2021-08-01', DATE '2021-08-15', 'J2' FROM DUAL UNION ALL
SELECT DATE '2021-08-16', DATE '2021-08-31', 'J2' FROM DUAL UNION ALL
SELECT DATE '2021-09-01', DATE '2021-11-01', 'J1' FROM DUAL UNION ALL
SELECT DATE '2021-11-01', DATE '2021-12-31', 'J1' FROM DUAL
兩個輸出:
標準差錯 EDDT 作業 2021-07-01 00:00:00 2021-07-31 00:00:00 J1 2021-08-16 00:00:00 2021-08-31 00:00:00 J2 2021-11-01 00:00:00 2021-12-31 00:00:00 J1
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/346765.html
