简体   繁体   English

Oracle SQL 开发人员 - 循环遍历行值

[英]Oracle SQL Developer - Looping Through Row Values

I have a table below where I know the the Start and End Positions in the Position Column.我有一张下表,我知道 Position 列中的开始和结束位置。 The table is order by Start Time in DESC order.该表按开始时间以 DESC 顺序排列。

ID ID PREV End Time PREV 结束时间 Start Time开始时间 End Time时间结束 Position Position
1 1 1/1/2022 10:00 2022 年 1 月 1 日 10:00 1/1/2022 10:30 2022 年 1 月 1 日 10:30 1/1/2022 11:30 2022 年 1 月 1 日 11:30 Start开始
1 1 1/1/2022 12:30 2022 年 1 月 1 日 12:30 1/1/2022 13:30 2022 年 1 月 1 日 13:30 1/1/2022 14:30 2022 年 1 月 1 日 14:30 null null
1 1 1/1/2022 15:30 2022 年 1 月 1 日 15:30 1/1/2022 16:30 2022 年 1 月 1 日 16:30 1/1/2022 17:30 2022 年 1 月 1 日 17:30 End结尾
1 1 1/1/2022 18:30 2022 年 1 月 1 日 18:30 1/1/2022 19:30 2022 年 1 月 1 日 19:30 1/1/2022 20:30 2022 年 1 月 1 日 20:30 Start开始
1 1 1/1/2022 21:30 2022 年 1 月 1 日 21:30 1/1/2022 22:30 2022 年 1 月 1 日 22:30 1/1/2022 23:30 2022 年 1 月 1 日 23:30 null null
1 1 1/2/2022 0:30 2022 年 1 月 2 日 0:30 1/2/2022 1:30 2022 年 1 月 2 日 1:30 1/2/2022 2:30 2022 年 1 月 2 日 2:30 null null
1 1 1/2/2022 3:30 2022 年 1 月 2 日 3:30 1/2/2022 4:30 2022 年 1 月 2 日 4:30 1/2/2022 5:30 2022 年 1 月 2 日 5:30 End结尾

I want to be able to make two new columns where I can identify Trip 1 and 2 distinctly.我希望能够创建两个新列,在其中可以清楚地识别 Trip 1 和 2。 And I also want to number each leg for each trip.我还想为每次旅行的每条腿编号。 Below, is the table I desire.下面是我想要的表。

ID ID PREV End Time PREV 结束时间 Start Time开始时间 End Time时间结束 Position Position LEG Trip旅行
1 1 1/1/2022 10:00 2022 年 1 月 1 日 10:00 1/1/2022 10:30 2022 年 1 月 1 日 10:30 1/1/2022 11:30 2022 年 1 月 1 日 11:30 Start开始 1 1 1 1
1 1 1/1/2022 12:30 2022 年 1 月 1 日 12:30 1/1/2022 13:30 2022 年 1 月 1 日 13:30 1/1/2022 14:30 2022 年 1 月 1 日 14:30 null null 2 2 1 1
1 1 1/1/2022 15:30 2022 年 1 月 1 日 15:30 1/1/2022 16:30 2022 年 1 月 1 日 16:30 1/1/2022 17:30 2022 年 1 月 1 日 17:30 End结尾 3 3 1 1
1 1 1/1/2022 18:30 2022 年 1 月 1 日 18:30 1/1/2022 19:30 2022 年 1 月 1 日 19:30 1/1/2022 20:30 2022 年 1 月 1 日 20:30 Start开始 1 1 2 2
1 1 1/1/2022 21:30 2022 年 1 月 1 日 21:30 1/1/2022 22:30 2022 年 1 月 1 日 22:30 1/1/2022 23:30 2022 年 1 月 1 日 23:30 null null 2 2 2 2
1 1 1/2/2022 0:30 2022 年 1 月 2 日 0:30 1/2/2022 1:30 2022 年 1 月 2 日 1:30 1/2/2022 2:30 2022 年 1 月 2 日 2:30 null null 3 3 2 2
1 1 1/2/2022 3:30 2022 年 1 月 2 日 3:30 1/2/2022 4:30 2022 年 1 月 2 日 4:30 1/2/2022 5:30 2022 年 1 月 2 日 5:30 End结尾 4 4 2 2

Sometimes the data, isn't as perfect as the first row starting as the Start position.有时数据不如 Start position 开头的第一行那么完美。 Sometimes it starts in the middle of a trip.有时它从旅行的中间开始。 How can I exclude?我该如何排除? And sometimes the end, ends in the middle of a trip.有时结束,在旅行的中间结束。 How can I exclude?我该如何排除?

Please let me know if you have any questions.请让我知道,如果你有任何问题。 Thank you for taking the time to read.感谢您花时间阅读。

From Oracle 12, you can use MATCH_RECOGNIZE to do row-by-row processing:从 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'
)

Which, for the sample data:其中,对于样本数据:

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;

Outputs:输出:

ID ID PREV_END_TIME PREV_END_TIME START_TIME开始时间 END_TIME时间结束 POSITION POSITION LEG TRIP旅行
1 1 2022-01-01 10:00:00 2022-01-01 10:00:00 2022-01-01 10:30:00 2022-01-01 10:30:00 2022-01-01 11:30:00 2022-01-01 11:30:00 Start开始 1 1 1 1
1 1 2022-01-01 12:30:00 2022-01-01 12:30:00 2022-01-01 13:30:00 2022-01-01 13:30:00 2022-01-01 14:30:00 2022-01-01 14:30:00 null null 2 2 1 1
1 1 2022-01-01 15:30:00 2022-01-01 15:30:00 2022-01-01 16:30:00 2022-01-01 16:30:00 2022-01-01 17:30:00 2022-01-01 17:30:00 End结尾 3 3 1 1
1 1 2022-01-01 18:30:00 2022-01-01 18:30:00 2022-01-01 19:30:00 2022-01-01 19:30:00 2022-01-01 20:30:00 2022-01-01 20:30:00 Start开始 1 1 2 2
1 1 2022-01-01 21:30:00 2022-01-01 21:30:00 2022-01-01 22:30:00 2022-01-01 22:30:00 2022-01-01 23:30:00 2022-01-01 23:30:00 null null 2 2 2 2
1 1 2022-01-02 00:30:00 2022-01-02 00:30:00 2022-01-02 01:30:00 2022-01-02 01:30:00 2022-01-01 02:30:00 2022-01-01 02:30:00 null null 3 3 2 2
1 1 2022-01-02 03:30:00 2022-01-02 03:30:00 2022-01-02 04:30:00 2022-01-02 04:30:00 2022-01-01 05:30:00 2022-01-01 05:30:00 End结尾 4 4 2 2

db<>fiddle here db<> 在这里摆弄

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM