工作中遇到的SQL( 满足连续状态要求 )

需求:  查询告警信息,  具体的需求是,   某个类型的告警数量在连续 3 天的值大于  20, 就需要查询这个告警的名称。 

可能说的不太清楚, 因为涉及到公司的机密数据。 所以这里用  模拟数据描述:

  比如数据 日期  在我们项目中是 没有 时分秒的, 这里我做的数据 带上了,  但没有影响,

比如 0002 告警  连续 3天满足了大于20 的数量, 我们这里就是查询这样的 告警,

 我记得当时公司好多人都觉得 这种SQL 比较难写,  很多人都建议在java中 做处理。 哥做了简单分析, 首先 数据 满足了 连续状态, 我们只需要考虑一下都大于  20 的这种情况

 于是哥想到了 两种 方案:

 1 分析函数: 

        select * from (
   select t.*, lag(num,1,0) over( partition by typename order by  typename, rq) prev,
   lead(num,1,0) over( partition by typename order by  typename, rq) next
   from testConnect t --order by  typename, rq
   ) tab1 where tab1.num>20 and next>20 and prev>20;   



2 递归函数:

 


方法点评:   数据满足连续的状态,所以哥想到了分析函数, 分析函数中取相邻比较容易,但有一个order by  在效率上面 还是要考虑的,另外还好是 连续3天, 但如果是连续4  天, 5 天呢??  很麻烦的......

这种需求 一般 哥都是用 第二种,  因为好维护。 连续 4, 5 天就直接在  递归函数中限制, 多简单。  哥觉得 这种需求在OLAP 系统中还是比较常见的, 所以写下来, 或许以后看看的.......

 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值