按小时间隔分组
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;
思路是统计每小时签入和签出的次数,然后累加每个小时的总数。不同的是说的次数。
我是 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;
思路是统计每小时签入和签出的次数,然后累加每个小时的总数。不同的是说的次数。