oracle业务的sql,73-找到业务高峰时段的sql示例(报表开发类)

有人在技术讨论群里提出下面一个业务逻辑代码段:

68e0676134c329ff735efa04582a0c59.png

这段代码的业务逻辑是找到2019年业务量最多的61秒(我想本意应该是60秒,代码不够严谨)间隔及业务量。

这个业务题主用plsql完成,是比较典型的程序员思维,执行效率明显是非常低的,我给出的建议是可以直接按to_char(date_created,'yyyymmdd hh24mi')做group by,再找出最大值,sql写法比较简单,相信大部分开发人员应该都能够简单写出。

但是题主又补充了其他需求,说还可能需要按不同的时间间隔做统计,比如15秒间隔,30秒间隔等。

针对这种需求,我给出的SQL写法如下(以15秒间隔为例):

f27fdb8b176eaf2e3d7877e47e09818e.png

题主对两种写法做了性能对比,1000多万记录,我提供的写法耗时125秒,原plsql写法耗时1371秒(这个速度是无法接受的),效率相差10几倍,如果数据量再大,效率差别也会更大,而且优化后的sql还可以使用并行,还能提速。

上面的查询,间隔的起点是固定的,这种写法还不是太复杂。如果我们再把这个问题延伸一下,比如查一年内哪个连续10天的业务量最高,sql相对就复杂一些,下面是我给出的写法:

a99f0e7862bdb9368282f6528cb9c3d5.png

上面是一些使用分析函数的两个小案例,大家可以参考一下。同时,使用with的CTE写法会让sql的层次比较清晰,增强代码的可读性。

如果你有更好的写法,不妨在留言写出来,让大家一起学习一下。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值