Агрегирование данных из разных строк в SQL - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть очень простая таблица, из которой мне нужно создать представление. Сам стол имеет разные комнаты, и время начала / окончания каждой комнаты используется (есть резервирование).

Date             Start_Time               End_Time              Room

2019-06-08       08:00                    09:00                 101
2019-06-08       12:00                    14:00                 101
2019-06-08       18:30                    20:00                 101
2019-06-08       10:00                    13:30                 201
2019-06-08       14:00                    15:00                 201
2019-06-08       08:00                    09:00                 308
2019-06-08       09:30                    12:15                 308
2019-06-08       16:00                    17:00                 308
2019-06-08       17:30                    18:00                 308

Предположим, что есть больше дат, комнат и времени, конечно. Время на самом деле хранится как datetime, но я упрощаю его здесь.

То, что я пытаюсь сделать, - это создать представление, в котором мы можем видеть время, когда каждая комната доступна между бронированием, по дням. Это означает, что время окончания бронирования номера становится временем начала доступности комнаты, а время начала следующего бронирования номера является временем окончания доступности комнаты.

Результат будет выглядеть следующим образом.

Date             Start_Time               End_Time              Room

2019-06-08       00:00                    08:00                 101
2019-06-08       09:00                    12:00                 101
2019-06-08       14:00                    18:30                 101
2019-06-08       20:00                    23:59                 101
2019-06-08       00:00                    10:00                 201
2019-06-08       13:30                    14:00                 201
2019-06-08       15:00                    23:59                 201
2019-06-08       00:00                    08:00                 308
2019-06-08       09:00                    09:30                 308
2019-06-08       12:15                    16:00                 308
2019-06-08       17:00                    17:30                 308
2019-06-08       18:00                    23:59                 308

У меня проблемы с поиском хорошего способа сделать это. Моей первоначальной мыслью было запустить 2 выбора данных, чтобы получить время начала и окончания, а затем объединить их в один столбец с простым кодом, определяющим время начала / окончания (1/2 соответственно), создавая представление из этогоданные и поворот его, чтобы сформировать то, что мне нужно. Но у меня проблемы с этим.

Выбранный код выглядит следующим образом:

Create View [Room_Availability]

SELECT 

    Date
    ,start_time as 'Time'
    ,'1' as 'Time_Type'
    ,id as 'Room'

        from room_reservations

UNION

SELECT 

    Date
    ,end_time as 'Time'
    ,'1' as 'Time_Type'
    ,id as 'Room'

        from room_reservations


Results:

Date          Time      Time_Type       Room
2019-06-08    08:00     1               101
2019-06-08    12:00     1               101
2019-06-08    18:30     1               101
2019-06-08    10:00     1               201
2019-06-08    14:00     1               201
2019-06-08    08:00     1               308
2019-06-08    09:30     1               308
2019-06-08    16:00     1               308
2019-06-08    17:30     1               308
2019-06-08    09:00     2               101
2019-06-08    14:00     2               101
2019-06-08    20:00     2               101
2019-06-08    13:30     2               201
2019-06-08    15:00     2               201
2019-06-08    09:00     2               308
2019-06-08    12:15     2               308
2019-06-08    17:00     2               308
2019-06-08    18:30     2               308

Возможно, это был неправильный путь, так как я не могу понять, как я могу повернуть данные взаказ мне нужен. Я очень открыт для предложений.

1 Ответ

0 голосов
/ 02 ноября 2019

Я думаю, что вы просто хотите lead(): используя эту оконную функцию, вы можете получить время следующего запуска той же комнаты. Диапазон дат от конца текущего бронирования до начала следующего в той же комнате определяет интервал доступности:

select 
    date,
    room,
    end_time availability_start_time,
    lead(start_time) over(partition by room order by start_time) availability_end_time
from room_reservations
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...