Данные PostgreSQL с вечера прошлого дня до утра

У меня есть таблица с этой структурой и данными

Идентификатор Данные Дата Время 1 образец1 2022-11-10 21:10:00 2 образец2 2022-11-10 23:50:00 3 образец3 2022-11-11 01:20:00 4 образец4 2022-11-11 05:30:00 5 образец5 2022-11-11 20:59:00 6 образец6 2022-11-11 23:01:00 7 образец7 2022-11-12 01:01:00 8 образец8 2022-11-12 04:01:00

................................................ и так далее

Я хочу структуру таким образом

дата Дата начала Дата окончания 2022-11-11 21:10:00 05:30:00 2022-11-12 20:59:00 04:01:00

Время не фиксировано, поэтому сложно определить. Одна логика состоит в том, чтобы получить данные после 7 вечера до 8 утра, но не уверен. Любые предложения будут высоко оценены

Извините, но мне непонятно, почему между 4 и 5 строками должен быть разрыв. Найдите алгоритм, описывающий то, что вам нужно, и вы на полпути к решению.

Laurenz Albe 24.11.2022 14:41

@LaurenzAlbe, я считаю, что это перерыв между утром и вечером согласно названию. Итак, 05:30:00 — это последняя утренняя запись дня, а 20:59:00 — первая вечерняя запись. При этом неясно, каковы фактические значения, которые отмечают утренние и вечерние перерывы.

Adrian Klaver 24.11.2022 17:04

@LaurenzAlbe, никакой логики не будет, поэтому в некоторых случаях может быть 2 строки данных, а иногда может быть 10 строк. Вот почему я хочу, чтобы первые данные после 19:00 были временем начала, а последние данные до 8:00 могли быть конечным временем.

Bharat Paudyal 24.11.2022 20:17

Вы хотите сгруппировать временную метку с 7 pm to next day 8 am'. 7 вечера до 8 утра следующего дня в группе и next day 8 am to 7 pm в другой группе.?

jian 25.11.2022 06:12
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

структура базы данных

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');

запрос

алгоритм следующий:

  1. мы группируем по дате
  2. определяем интервал -5 часов и +8 часов
  3. ищем первые значения времени в зависимости от порядка (-5 часов - первое большее значение, +8 часов - первое меньшее значение)
  4. удаление нулей
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

Другие вопросы по теме