您的位置:首页 > 数据库

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

2015-09-07 23:38 295 查看
需求: 查询告警信息, 具体的需求是, 某个类型的告警数量在连续 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 系统中还是比较常见的, 所以写下来, 或许以后看看的.......




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: