按小时间隔分组

Group by hourly interval

我是 SQL 的新手,在尝试对支持 HiveSQL 的数据库制作每小时报告时遇到问题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)还没有退房。所以基本上我试图获得每小时的入住、退房和住宿总结报告。

我不知道如何计算每小时间隔 table,因为简单地按 check_in 或 check_out 小时分组并不能得到预期的结果。所有的日期字段本来就是Unix时间戳数据类型,所以可以随意使用日期函数。

任何指示和帮助将不胜感激,谢谢!

这是一种反透视数据并使用累积和的方法:

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;

思路是统计每小时签入和签出的次数,然后累加每个小时的总数。不同的是说的次数。