我在下面有一個表格,我知道位置列中的開始和結束位置。該表按開始時間以 DESC 順序排列。
| ID | PREV 結束時間 | 開始時間 | 時間結束 | 位置 |
|---|---|---|---|---|
| 1 | 2022 年 1 月 1 日 10:00 | 2022 年 1 月 1 日 10:30 | 2022 年 1 月 1 日 11:30 | 開始 |
| 1 | 2022 年 1 月 1 日 12:30 | 2022 年 1 月 1 日 13:30 | 2022 年 1 月 1 日 14:30 | 空值 |
| 1 | 2022 年 1 月 1 日 15:30 | 2022 年 1 月 1 日 16:30 | 2022 年 1 月 1 日 17:30 | 結尾 |
| 1 | 2022 年 1 月 1 日 18:30 | 2022 年 1 月 1 日 19:30 | 2022 年 1 月 1 日 20:30 | 開始 |
| 1 | 2022 年 1 月 1 日 21:30 | 2022 年 1 月 1 日 22:30 | 2022 年 1 月 1 日 23:30 | 空值 |
| 1 | 2022 年 1 月 2 日 0:30 | 2022 年 1 月 2 日 1:30 | 2022 年 1 月 2 日 2:30 | 空值 |
| 1 | 2022 年 1 月 2 日 3:30 | 2022 年 1 月 2 日 4:30 | 2022 年 1 月 2 日 5:30 | 結尾 |
我希望能夠創建兩個新列,在其中可以清楚地識別 Trip 1 和 2。我還想為每次旅行的每條腿編號。下面是我想要的表。
| ID | PREV 結束時間 | 開始時間 | 時間結束 | 位置 | 腿 | 旅行 |
|---|---|---|---|---|---|---|
| 1 | 2022 年 1 月 1 日 10:00 | 2022 年 1 月 1 日 10:30 | 2022 年 1 月 1 日 11:30 | 開始 | 1 | 1 |
| 1 | 2022 年 1 月 1 日 12:30 | 2022 年 1 月 1 日 13:30 | 2022 年 1 月 1 日 14:30 | 空值 | 2 | 1 |
| 1 | 2022 年 1 月 1 日 15:30 | 2022 年 1 月 1 日 16:30 | 2022 年 1 月 1 日 17:30 | 結尾 | 3 | 1 |
| 1 | 2022 年 1 月 1 日 18:30 | 2022 年 1 月 1 日 19:30 | 2022 年 1 月 1 日 20:30 | 開始 | 1 | 2 |
| 1 | 2022 年 1 月 1 日 21:30 | 2022 年 1 月 1 日 22:30 | 2022 年 1 月 1 日 23:30 | 空值 | 2 | 2 |
| 1 | 2022 年 1 月 2 日 0:30 | 2022 年 1 月 2 日 1:30 | 2022 年 1 月 2 日 2:30 | 空值 | 3 | 2 |
| 1 | 2022 年 1 月 2 日 3:30 | 2022 年 1 月 2 日 4:30 | 2022 年 1 月 2 日 5:30 | 結尾 | 4 | 2 |
有時資料并不像從起始位置開始的第一行那么完美。有時它從旅行的中間開始。我該如何排除?有時結束,在旅行的中間結束。我該如何排除?
請讓我知道,如果你有任何問題。感謝您花時間閱讀。
uj5u.com熱心網友回復:
從 Oracle 12 開始,您可以使用MATCH_RECOGNIZE來進行逐行處理:
SELECT ID,
PREV_End_Time,
Start_Time,
End_Time,
Position,
Leg,
Trip
FROM table_name
MATCH_RECOGNIZE(
PARTITION BY ID
ORDER BY start_time
MEASURES
MATCH_NUMBER() AS trip,
COUNT(*) AS leg
ALL ROWS PER MATCH
PATTERN (start_row intermediate_row* end_row)
DEFINE
start_row AS position = 'Start',
intermediate_row AS position IS NULL,
end_row AS position = 'End'
)
其中,對于樣本資料:
CREATE TABLE table_name (ID, PREV_End_Time, Start_Time, End_Time, Position) AS
SELECT 1, DATE '2022-01-01' INTERVAL '10:00' HOUR TO MINUTE, DATE '2022-01-01' INTERVAL '10:30' HOUR TO MINUTE, DATE '2022-01-01' INTERVAL '11:30' HOUR TO MINUTE, 'Start' FROM DUAL UNION ALL
SELECT 1, DATE '2022-01-01' INTERVAL '12:30' HOUR TO MINUTE, DATE '2022-01-01' INTERVAL '13:30' HOUR TO MINUTE, DATE '2022-01-01' INTERVAL '14:30' HOUR TO MINUTE, NULL FROM DUAL UNION ALL
SELECT 1, DATE '2022-01-01' INTERVAL '15:30' HOUR TO MINUTE, DATE '2022-01-01' INTERVAL '16:30' HOUR TO MINUTE, DATE '2022-01-01' INTERVAL '17:30' HOUR TO MINUTE, 'End' FROM DUAL UNION ALL
SELECT 1, DATE '2022-01-01' INTERVAL '18:30' HOUR TO MINUTE, DATE '2022-01-01' INTERVAL '19:30' HOUR TO MINUTE, DATE '2022-01-01' INTERVAL '20:30' HOUR TO MINUTE, 'Start' FROM DUAL UNION ALL
SELECT 1, DATE '2022-01-01' INTERVAL '21:30' HOUR TO MINUTE, DATE '2022-01-01' INTERVAL '22:30' HOUR TO MINUTE, DATE '2022-01-01' INTERVAL '23:30' HOUR TO MINUTE, NULL FROM DUAL UNION ALL
SELECT 1, DATE '2022-01-02' INTERVAL '00:30' HOUR TO MINUTE, DATE '2022-01-02' INTERVAL '01:30' HOUR TO MINUTE, DATE '2022-01-01' INTERVAL '02:30' HOUR TO MINUTE, NULL FROM DUAL UNION ALL
SELECT 1, DATE '2022-01-02' INTERVAL '03:30' HOUR TO MINUTE, DATE '2022-01-02' INTERVAL '04:30' HOUR TO MINUTE, DATE '2022-01-01' INTERVAL '05:30' HOUR TO MINUTE, 'End' FROM DUAL;
輸出:
ID PREV_END_TIME 開始時間 時間結束 位置 腿 旅行 1 2022-01-01 10:00:00 2022-01-01 10:30:00 2022-01-01 11:30:00 開始 1 1 1 2022-01-01 12:30:00 2022-01-01 13:30:00 2022-01-01 14:30:00 空值 2 1 1 2022-01-01 15:30:00 2022-01-01 16:30:00 2022-01-01 17:30:00 結尾 3 1 1 2022-01-01 18:30:00 2022-01-01 19:30:00 2022-01-01 20:30:00 開始 1 2 1 2022-01-01 21:30:00 2022-01-01 22:30:00 2022-01-01 23:30:00 空值 2 2 1 2022-01-02 00:30:00 2022-01-02 01:30:00 2022-01-01 02:30:00 空值 3 2 1 2022-01-02 03:30:00 2022-01-02 04:30:00 2022-01-01 05:30:00 結尾 4 2
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/421795.html
標籤:
