事情的起因是要改善代码~~~
原先是在一个for循环里面执行sql查询语句,情景大概是每次循环都要用当前循环的值(时间)作为条件去sql里查,当时是每次循环都去执行sql语句。虽然能实现,But,执行的日志发现,每次都会去连接池里面拿一个连接,查完后再归还连接……如此循环,效率和性能都不太科学。。
所以发现为啥之前不在sql里改善??原来是需要每一分钟都要数据,如果查不到要将数值自动补0。所以当初用for循环是为了判断——如果查不到数据就补0,但这样始终还是忒慢!!
于是有同事提出用right join一个结果集,这个结果集用于从指定的时间往前推n分钟,并且是一个序列的形式。因为是right join,所以从数据表(左表)里查不到的记录会自动补为null,完了再用case when将Null转成0即可。——因为sql执行顺序是from->left(right) join->select
现假设我有一张t_data表:
其中time字段是时间字符串, 而total字段是数值型的字段。
现在的需求是查出前若干分钟的total值(注意是要求每一分钟都有时间,如果原表没有时间,就把时间加上并把total补0)
现假设t_data中现有的数据如下:
select * from t_data
我现在想要查出前若干分钟的结果集,达到上述要求。
第一步:首先想办法得出指定时间的前若干分钟的序列,这里我用20分钟为例。重点来了,这句sql很神奇!!
select to_char(to_date('201511101014', 'YYYYMMDDHH24MI') - (level - 1) / 1440, 'yyyymmddhh24mi') as minute_sequence from dual connect by level <= 20
仔细检查到201511101000这条记录后的一条记录是201511100959,说明达到了正确利用sql语句求解时间序列的方法。
同理:(level - 1) / 1440你除以24得到的会是小时序列,除以1得到天的序列,而除以86400则会得掉秒级的序列。
把-(level-1)改成+(level-1)则是递增。
第二步:再用right join第一步查到的结果集:
select b.minute_sequence time, case when total is null then 0 else total end total from t_data a right join (select to_char(to_date('201511101014', 'YYYYMMDDHH24MI') - (level - 1) / 1440, 'yyyymmddhh24mi') as minute_sequence from dual connect by level <= 20) b on a.time = b.minute_sequence order by b.minute_sequence desc
查看结果:
可以看出,时间也补上了,而原本t_data里面没有total字段的记录也补上0了。达到了最初的目的。。
注:这里特别注意case when then (when then...) else end的语法!
其实还蛮复杂的,sql求时间序列于我是件蛮新颖、有趣的事,而巩固巩固下right join和case when then else end的语法也蛮不错的。
相关推荐
介绍sqlserver中创建类似于oracle中序列的过程,此例只是一个简单的模仿。
oracle创建表,索引,表空间,触发器,schema用户,序列的Sql文
最近项目中要用oracle中的序列相关的内容,本人对oracle是小白一个,没办法只能在网上找相关的资源,还好,发现了一些,感觉挺实用的,就分享给大家了,该资源是oracle序列的创建、修改、以及删除的相关操作,有用例...
ORACLE SQL使用示例 二.创建索引 三.创建约束 四.创建视图 五. 创建序列 六. 创建同义词 七.SQL DML数据操纵语句 八,SQL内部函数 九. PLSQL 结构化程序
Oracle 删除所有表,视图,序列,函数,存储过程等SQL语句文档。
【完整课程列表】 oracle_系统表.pdf ...数据库开发 Oracle数据库 SQL开发教程 第16章 序列、索引、同义词(共34页).pdf 数据库开发 Oracle数据库 SQL开发教程 第17章 用户、权限和角色(共28页).pdf
OracleSQL实例-序列的再创建实例.pdf 学习资料 复习资料 教学资源
【完整Oracle SQL开发教程课件如下】 ...数据库开发 Oracle数据库 SQL开发教程 第16章 序列、索引、同义词(共34页).pdf 数据库开发 Oracle数据库 SQL开发教程 第17章 用户、权限和角色(共28页).pdf
介绍了PL/SQL工具,导出oracle序列的方法以及步骤
选定某一主题,运用oracle数据库,以及相关技术方法设计和开发一个信息管理的数据库系统,实现数据库的开发应用以及日常管理维护等基本功能。 具体要求如下: (1)选定某一主题,创建一个oracle数据库,对其进行...
文档 里面包含了 mysql创建 oracle序列的脚本,数据库表、函数、使用案例 sql和截图 ,自带 根据步长和值长度,到数据最大时返回0;手册说明详细,表名字段都有解释,一看就懂
Oracle的解析函数为检查间隙提供了一种要快捷得多的方法。它们使你在使用完整的、面向集合的SQL处理的同时,仍然能够看到下一个行(LEAD)或者前一行(LAG)的数值。文中介绍了Oracle解析函数的格式。
第一篇 Oracle管理配置 第1章 Oracle安装配置(教学视频:10分钟) 23 1.1 Oracle简介 23 1.1.1 数据库术语 23 1.1.2 主流数据库简介 24 1.1.3 Oracle数据库的特点 24 1.2 安装Oracle数据库 25 1.2.1 Oracle...
【完整Oracle SQL开发教程课件如下】 ...数据库开发 Oracle数据库 SQL开发教程 第16章 序列、索引、同义词(共34页).pdf 数据库开发 Oracle数据库 SQL开发教程 第17章 用户、权限和角色(共28页).pdf
21天学会oracle(电子教案) 第1章 Oracle安装配置.ppt 第2章 Oracle常用工具.ppt 第3章 SQL Plus和PL.ppt 第4章 Oralce数据库.ppt 第5章 Oracle数据表对象.ppt 第6章 约束.ppt 第7章 视图.ppt 第8章 函数与存储过程...
oracle 增加序列 触发器 全过程 sql文件只需更换表名
【完整Oracle SQL开发教程课件如下】 ...数据库开发 Oracle数据库 SQL开发教程 第16章 序列、索引、同义词(共34页).pdf 数据库开发 Oracle数据库 SQL开发教程 第17章 用户、权限和角色(共28页).pdf
Oracle笔记 五、创建表、约束、视图、索引、序列、同义词、表空间 Oracle笔记 六、PL/SQL简单语句块、变量定义 Oracle笔记 七、PL/SQL 异常处理 Oracle笔记 八、PL/SQL跳转/判断/循环语句块 Oracle笔记 九、PL/...