oracle如何将数据按时间段分组

假如我们有一组与时间关联的数据,我们如何按指定时间段分组对数据进行分组呢
我们有一组全天某路段不同时间检测到路过车辆的速度,我们将一天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 |
| ... | ... |

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,094评论 19 139
  • 奔驰在高速公路上,拍打着飞翔的翅膀,飞往心的方向。父亲母亲的脸庞,浮现在我的心上。最亲最爱的爹娘,眼看苦日子即将成...
    mjhjht阅读 2,593评论 3 3

友情链接更多精彩内容