工作中遇到的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 系统中还是比较常见的, 所以写下来, 或许以后看看的.......
可能说的不太清楚, 因为涉及到公司的机密数据。 所以这里用 模拟数据描述:
比如数据 日期 在我们项目中是 没有 时分秒的, 这里我做的数据 带上了, 但没有影响,
比如 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 系统中还是比较常见的, 所以写下来, 或许以后看看的.......
相关文章推荐
- MDT 2013 从入门到精通之SQL New MDT Database
- MDT 2013 从入门到精通之SQL New MDT Database
- redis实现有序的消息队列
- Mysql 安装出现error Nr.1045
- MSSQL 当前会话设置隔离级别与查询
- redis常用命令笔记
- SQLSERVER2008安装教程 亲测可用
- MDT 2013 从入门到精通之排错Provider:SQL Network Interfaces,error:26
- Oracle序列nextval以及currval的区别
- Ubuntu下 Redis安装
- Oracle同义词synonym用法小结
- 数据库中的约束
- Oracle dblink用法总结
- 对数据库中数据模型的认识
- MySQL(十六)之使用Mysql-Proxy实现MySQL的读写分离
- Oracle遇到的一些问题
- plsql使用
- SQL 中关于groupby的信息
- 关于Oracle修改IP地址引起的问题
- (mysql)a little...