从时间戳列中获取开始日期和结束日期,并按 SQL 中的模式进行分区

fetching startdate and enddate from timestemp column and partition by modes in SQL

我正在尝试解决这个问题,这是 table1 我正在尝试 output 我无法建立一个逻辑,我如何从中获取开始日期和结束日期SQL.

中的相同 timestemp
CREATE TABLE table1 (
  `batch` INTEGER,
  `timestemp` VARCHAR(8),
  `mo` INTEGER,
  `speed` INTEGER
);

INSERT INTO table1
  (`batch`, `timestemp`, `mo`, `speed`)
VALUES
  ('1', '00:18:00', '0', '0'),
  ('1', '01:18:00', '0', '0'),
  ('1', '02:18:00', '0', '0'),
  ('1', '03:18:00', '1', '5'),
  ('1', '04:18:00', '1', '6'),
  ('1', '05:18:00', '1', '7'),
  ('1', '06:18:00', '2', '10'),
  ('1', '07:18:00', '2', '9'),
  ('1', '08:18:00', '2', '8'),
  ('1', '09:18:00', '3', '12'),
  ('1', '10:18:00', '3', '23'),
  ('1', '11:18:00', '3', '21'),
  ('1', '12:18:00', '4', '20'),
  ('1', '13:18:00', '4', '22');

mo=模式

batch timestemp mo speed
1 00:18:00 0 0
1 01:18:00 0 0
1 02:18:00 0 0
1 03:18:00 1 5
1 04:18:00 1 6
1 05:18:00 1 7
1 06:18:00 2 10
1 07:18:00 2 9
1 08:18:00 2 8
1 09:18:00 3 12
1 10:18:00 3 23
1 11:18:00 3 21
1 12:18:00 4 20
1 13:18:00 4 22

o输出:

batch start time end time mode
1 00:18:00 03:17:00 0
1 03:18:00 06:17:00 1
1 06:18:00 09:17:00 2
1 09:18:00 12:17:00 3
1 12:18:00 13:18:00 4

架构 (MySQL v8.0)

CREATE TABLE table1 (
  `batch` INTEGER,
  `timestemp` TIME,
  `mo` INTEGER,
  `speed` INTEGER
);

INSERT INTO table1
  (`batch`, `timestemp`, `mo`, `speed`)
VALUES
  ('1', '00:18:00', '0', '0'),
  ('1', '01:18:00', '0', '0'),
  ('1', '02:18:00', '0', '0'),
  ('1', '03:18:00', '1', '5'),
  ('1', '04:18:00', '1', '6'),
  ('1', '05:18:00', '1', '7'),
  ('1', '06:18:00', '2', '10'),
  ('1', '07:18:00', '2', '9'),
  ('1', '08:18:00', '2', '8'),
  ('1', '09:18:00', '3', '12'),
  ('1', '10:18:00', '3', '23'),
  ('1', '11:18:00', '3', '21'),
  ('1', '12:18:00', '4', '20'),
  ('1', '13:18:00', '4', '22');

查询

SELECT batch
     , mode
     , start_time
     , COALESCE(SUBTIME(LEAD(start_time) OVER (ORDER BY start_time), '00:01:00'), end_time) end_time
FROM (
  SELECT batch
       , min(timestemp) start_time
       , max(timestemp) end_time
       , mo mode
  FROM table1
  GROUP BY batch, mo
  ) min_max;
batch mode start_time end_time
1 0 00:18:00 03:17:00
1 1 03:18:00 06:17:00
1 2 06:18:00 09:17:00
1 3 09:18:00 12:17:00
1 4 12:18:00 13:18:00

View on DB Fiddle