Группировать по часовым интервалам - PullRequest
1 голос
/ 06 января 2020

Я новичок в SQL и у меня возникают проблемы при попытке сделать почасовой отчет для базы данных, поддерживающей Hive SQL.

Вот мой набор данных

|NAME| CHECKIN_HOUR |CHECKOUT_HOUR|
|----|--------------|-------------|
| A  |       00     |      00     | 
| B  |       00     |      01     | 
| C  |       00     |      02     |
| D  |       00     |      null   |
| E  |       01     |      02     |
| F  |       01     |      null   |

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

|TIME| CHECKIN_NUMBER |CHECKOUT_NUMBER|STAY_NUMBER|
|----|----------------|---------------|-----------|
| 00 |        4       |       1       |     3     |
| 01 |        2       |       1       |     4     | 
| 02 |        0       |       2       |     2     |

stay_number означает подсчет числа людей, которые не зарегистрировались к концу этого часа, например, 2 в последнем ряду означает, что к концу 2 часа ночи два человека (D и F) еще не зарегистрировались. В общем, я пытаюсь получить сводный отчет о регистрации заезда и отъезда и отчет о пребывании за каждый час.

Я понятия не имею, как рассчитать таблицу часовых интервалов, поскольку простое группирование по часам check_in или check_out не дает ожидаемого результата. Все поля даты изначально имеют тип данных Unix timestamp, поэтому не стесняйтесь использовать для них функции даты.

Будем благодарны за любые инструкции и помощь, спасибо!

1 Ответ

2 голосов
/ 06 января 2020

Вот один метод, который разворачивает данные и использует кумулятивные суммы:

select hh, 
       sum(ins) as checkins, sum(outs) as checkouts,
       sum(sum(ins)) over (order by hh) - sum(sum(outs)) over (order by hh)
from ((select checkin_hour as hh, count(*) as ins, 0 as outs
       from t
       group by checkin_hour
      ) union all
      (select checkout_hour, 0 as ins, count(*) as outs
       from t
       where checkout_hour is not null
       group by checkout_hour
      )
     ) c
group by hh
order by hh;

Идея состоит в том, чтобы подсчитать количество проверок в каждом часе и затем накапливать итоги за каждый час. Разница в количестве говорит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...