假如我们有一组与时间关联的数据,我们如何按指定时间段分组对数据进行分组呢
我们有一组全天某路段不同时间检测到路过车辆的速度,我们将一天24小时按15分钟分组,将所有数据分为96组,再对每组求平均速度
表名为veh_speed
| time | speed |
| ------------- |:-------------:| -----:|
| 20160606001600 | 40 |
| 20160606001700 | 30 |
| 20160606001800 | 35 |
| 20160606002100 | 31 |
| ... | ... |
开发环境为PL/SQL
我们这里使用case语句
(case when substr(time,11,2)<15 then to_date(concat(substr(time,1,10),'0000'),'yyyymmddhh24miss')
when substr(time,11,2)>=15 and substr(time,11,2)<30 then to_date(concat(substr(time,1,10),'1500'),'yyyymmddhh24miss')
when substr(time,11,2)>=30 and substr(time,11,2)<45 then to_date(concat(substr(time,1,10),'3000'),'yyyymmddhh24miss')
else to_date(concat(substr(time,1,10),'4500'),'yyyymmddhh24miss') end) ttime
time字段下数据格式为文本格式,用to_date将数据转为日期格式,substr用于提取分钟以前的字段,concat连接我们需要分组的字段,when...then...表示分组规则。
完整代码如下
select avg(speed) as avg_speed,(case when substr(time,11,2)<15 then to_date(concat(substr(time,1,10),'0000'),'yyyymmddhh24miss')
when substr(time,11,2)>=15 and substr(time,11,2)<30 then to_date(concat(substr(time,1,10),'1500'),'yyyymmddhh24miss')
when substr(time,11,2)>=30 and substr(time,11,2)<45 then to_date(concat(substr(time,1,10),'3000'),'yyyymmddhh24miss')
else to_date(concat(substr(time,1,10),'4500'),'yyyymmddhh24miss') end) ttime
from veh_speed
group by ttime;
输出结果如下
| avg_speed | ttime |
| ------------- |:-------------:| -----:|
| 35 | 2016/0606 00:15:00 |
|31 | 2016/0606 00:20:00 |
| ... | ... |
网友评论