SQL: как вы вычисляете занятость / количество используемых объектов для объекта?

#sql #sql-server #count #counter #duration

#sql #sql-server #подсчет #счетчик #Продолжительность

Вопрос:

Я пытаюсь рассчитать количество занятых шкафчиков в раздевалке. Набор данных выглядит следующим образом:

 Locker ID   Check-in Datetime   Check-out Datetime  Member ID
1           2/18/2021 08:15am   2/18/2021 10:20am   A
2           2/18/2021 09:00am   2/18/2021 09:30am   B
3           2/18/2021 09:15am   2/18/2021 11:05am   C
4           2/18/2021 10:25am   2/18/2021 11:50am   D
 

Моим идеальным результатом будет количество занятых шкафчиков в час:

 Date        Hour                No. of Occupied Lockers
2/18/2021   8:00am - 9:00am     1
2/18/2021   9:00am - 10:00am    3
2/18/2021   10:00am - 11:00am   3
2/18/2021   11:00am - 12:00pm   1
 

Я могу вручную вычислить это число в Excel («количество шкафчиков для регистрации в течение часа» «количество шкафчиков, используемых в течение часа» — «количество выездов в течение часа»), но я не могу вычислить его в SQL-сервер. Я понятия не имею, как получить количество используемых шкафчиков в приведенном выше уравнении.

Под «занятым» я подразумеваю шкафчик, который в настоящее время используется в течение часа. Например, если пользователь A зарегистрирует (начнет использовать) шкафчик в 8:30 утра и выпишется (освободит шкафчик и прекратит его использование) в 10:30 утра, то для пользователя A один «занятый» шкафчик будет учитываться в течение 8:00 — 8:59 утра, 9: 00-9:59 и 10:00-10:59 соответственно.

Комментарии:

1. Пожалуйста, определите, что означает «занят». В начале часа? Конец? В любое время?

2. Дорогой Гордон, приношу свои извинения за путаницу. Под «занятым» я подразумеваю шкафчик, который в настоящее время используется в течение часа. Например, если пользователь A зарегистрирует (начнет использовать) шкафчик в 8:30 утра и выпишется (освободит шкафчик и прекратит его использование) в 10:30 утра, то для пользователя A один «занятый» шкафчик будет учитываться в течение 8:00 — 8:59 утра, 9: 00-9:59 и 10:00-10:59 соответственно.

Ответ №1:

Вам нужно сгенерировать часы. Затем вы можете выполнить вычисление. Если вы хотите в любое время в течение часа:

 with dt as (
      select convert(datetime, '2021-02-18 08:00:00') as dt
      union all
      select dateadd(hour, 1, dt)
      from dt
      where dt < '2012-02-18 11:00:00'
     )
select dt,
       (select count(*)
        from t
        where t.checkin < dateadd(hour, 1, dt.dt) and
              t.checkout >= dt.dt
       ) as cnt
from dt;