У меня есть таблица с этой структурой и данными
................................................ и так далее
Я хочу структуру таким образом
Время не фиксировано, поэтому сложно определить. Одна логика состоит в том, чтобы получить данные после 7 вечера до 8 утра, но не уверен. Любые предложения будут высоко оценены
@LaurenzAlbe, я считаю, что это перерыв между утром и вечером согласно названию. Итак, 05:30:00
— это последняя утренняя запись дня, а 20:59:00
— первая вечерняя запись. При этом неясно, каковы фактические значения, которые отмечают утренние и вечерние перерывы.
@LaurenzAlbe, никакой логики не будет, поэтому в некоторых случаях может быть 2 строки данных, а иногда может быть 10 строк. Вот почему я хочу, чтобы первые данные после 19:00 были временем начала, а последние данные до 8:00 могли быть конечным временем.
Вы хотите сгруппировать временную метку с 7 pm to next day 8 am'.
7 вечера до 8 утра следующего дня в группе и next day 8 am to 7 pm
в другой группе.?
структура базы данных
create table work (id serial, data text, ev_date date, ev_time time);
insert into work(data, ev_date, ev_time) values
('sample1', '2022-11-10', '21:10:00'),
('sample2', '2022-11-10', '23:50:00'),
('sample3', '2022-11-11', '01:20:00'),
('sample4', '2022-11-11', '05:30:00'),
('sample5', '2022-11-11', '20:59:00'),
('sample6', '2022-11-11', '23:01:00'),
('sample7', '2022-11-12', '01:01:00'),
('sample8', '2022-11-12', '04:01:00');
запрос
алгоритм следующий:
with s as (select ev_date from work group by ev_date),
p as (select s.ev_date,
(select work.ev_time from work
where (s.ev_date - interval '5 hour')::date = work.ev_date
and ((s.ev_date - interval '5 hour')::time < work.ev_time)
order by work.ev_date,work.ev_time limit 1) start_time,
(select work.ev_time from work
where (s.ev_date + interval '8 hour')::date = work.ev_date
and ((s.ev_date + interval '8 hour')::time > work.ev_time)
order by work.ev_date,work.ev_time desc limit 1) end_time
from s)
select p.ev_date,p.start_time,p.end_time from p where p.start_time is not null and p.end_time is not null order by p.ev_date;
результат
ev_date | start_time | end_time
------------+------------+----------
2022-11-11 | 21:10:00 | 05:30:00
2022-11-12 | 20:59:00 | 04:01:00
Извините, но мне непонятно, почему между 4 и 5 строками должен быть разрыв. Найдите алгоритм, описывающий то, что вам нужно, и вы на полпути к решению.