簡體   English   中英

Oracle SQL 開發人員 - 循環遍歷行值

[英]Oracle SQL Developer - Looping Through Row Values

我有一張下表,我知道 Position 列中的開始和結束位置。 該表按開始時間以 DESC 順序排列。

ID PREV 結束時間 開始時間 時間結束 Position
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 null
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 null
1 2022 年 1 月 2 日 0:30 2022 年 1 月 2 日 1:30 2022 年 1 月 2 日 2:30 null
1 2022 年 1 月 2 日 3:30 2022 年 1 月 2 日 4:30 2022 年 1 月 2 日 5:30 結尾

我希望能夠創建兩個新列,在其中可以清楚地識別 Trip 1 和 2。 我還想為每次旅行的每條腿編號。 下面是我想要的表。

ID PREV 結束時間 開始時間 時間結束 Position 旅行
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 null 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 null 2 2
1 2022 年 1 月 2 日 0:30 2022 年 1 月 2 日 1:30 2022 年 1 月 2 日 2:30 null 3 2
1 2022 年 1 月 2 日 3:30 2022 年 1 月 2 日 4:30 2022 年 1 月 2 日 5:30 結尾 4 2

有時數據不如 Start position 開頭的第一行那么完美。 有時它從旅行的中間開始。 我該如何排除? 有時結束,在旅行的中間結束。 我該如何排除?

請讓我知道,如果你有任何問題。 感謝您花時間閱讀。

從 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 開始時間 時間結束 POSITION 旅行
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 null 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 null 2 2
1 2022-01-02 00:30:00 2022-01-02 01:30:00 2022-01-01 02:30:00 null 3 2
1 2022-01-02 03:30:00 2022-01-02 04:30:00 2022-01-01 05:30:00 結尾 4 2

db<> 在這里擺弄

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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