事情的起因是要改善代码~~~
原先是在一个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的语法也蛮不错的。
相关推荐
在Oracle数据库管理中,序列是一种常用的对象,用于自动产生唯一的数值。序列通常被用来作为主键或唯一标识符,特别是在自动生成记录ID时。然而,有时候我们可能需要重置序列,使其从特定值开始,例如从1开始增长,...
在数据库管理领域,Oracle SQL和MySQL SQL是两种广泛使用的SQL方言,它们在语法和功能上存在一定的差异。当需要将一个基于Oracle SQL的应用程序迁移到MySQL环境时,就需要进行SQL语句的转换工作。本项目提供了一个...
### SQL Server 中创建类似 Oracle 序列的存储过程 #### 背景介绍 在数据库管理系统(DBMS)中,序列是一种自增的数据结构,常用于自动产生唯一标识符(如ID)。Oracle 数据库提供了非常方便的序列机制,而 SQL ...
在Oracle数据库中,序列(Sequence)是一种特殊的数据对象,它能自动地生成唯一的整数,通常用于为主键字段提供连续的标识符。序列的使用极大地简化了数据插入过程,特别是对于那些需要保持唯一性的整数字段,如员工...
- `CURRVAL`和`NEXTVAL`在Oracle中处理序列,SQL Server中使用`IDENT_CURRENT`和`IDENTITY`属性。 - `NULLIF`在Oracle和SQL Server中用于比较并返回NULL。 - `UID`、`SUSER_ID`、`USER_ID`、`USER`、`CURRENT_...
Oracle SQL中的序列(Sequences)是数据库对象,用于生成唯一的整数序列,通常用于自动为表的主键字段提供唯一标识符。在这个实例中,我们将深入理解如何创建、使用和管理Oracle序列,以及如何处理序列的缓存问题。 ...
7. **表分区**:大表的分区技术能提升查询效率,尤其对于时间序列数据。学习如何根据业务需求选择合适的分区策略(范围、列表、哈希等)。 8. **并行查询**:通过分配任务到多个处理器,并行查询可以加速大查询的...
在Oracle数据库管理中,SQL(Structured Query Language)是用于创建、操作和管理数据库的主要工具。以下将详细讲解标题和描述中涉及的各个知识点: 1. **创建表**:在Oracle中,使用`CREATE TABLE`语句来定义新的...
在Oracle数据库中,序列(Sequences)是一种自动递增或递减的数字生成器,常用于主键生成或者自增字段。批量修改Oracle序列值的需求可能出现在数据迁移、恢复或测试环境中,确保序列与实际数据匹配。这篇博客分享的...
通过对 Oracle 和 SQL Server 的深度对比,我们可以看出两者在操作系统的支持、版本和发行版、实例和数据库管理、事务一致性与基于时间点的恢复、系统元数据、启动与配置参数、动态视图、存储结构、启动与关闭、...
Oracle SQL 是一种强大的数据库查询语言,广泛用于管理和处理Oracle数据库中的数据。以下是对给定测试题目中涉及的一些关键知识点的详细解释: 1. 统计每个部门员工的数目: 使用 `SELECT` 语句配合 `COUNT(*)` ...
### MySQL生成Oracle序列知识点 #### 一、背景与概述 在数据库领域中,不同数据库管理系统(DBMS)之间存在显著差异,比如Oracle与MySQL在处理序列(sequence)的方式上就有本质的不同。Oracle提供了内置的支持来管理...
Oracle数据库系统与SQL(结构化查询语言)是两个在数据库管理领域中不可或缺的概念,它们有着密切的联系,但也有明显的差异。SQL是一种用于管理和处理关系型数据库的标准语言,而Oracle则是一个具体的数据库管理系统...
本文将深入探讨如何使用PL/SQL工具来导出Oracle序列,并详细阐述相关的步骤。 首先,让我们了解Oracle序列的基本概念。序列由一系列连续的整数组成,可以设置起始值、增量和最大值等属性。创建序列的基本语法如下:...
Oracle 和 SQL Server 是两种广泛应用的关系型数据库管理系统,它们在语法和功能上存在一定的差异。以下是对两者主要区别的一些详细说明: 1. **伪列 ROWNUM**: 在Oracle中,ROWNUM是一个伪列,用于获取结果集中...
### Oracle 创建表与序列知识点详解 #### 一、Oracle创建表的基本语法与示例解析 在Oracle数据库中,创建表是进行数据管理的基础操作之一。下面将通过几个具体实例来详细解析创建表的过程。 ##### 示例1:创建...
在Oracle数据库管理中,索引、序列和权限设置是三个非常关键的概念,它们分别用于提高数据检索速度、自动生成唯一序列值以及控制数据库资源的访问权限。以下是对这些概念的详细解析,基于提供的实验内容: ### 一、...
在Oracle SQL中,根据年份和周数获取特定日期是一个常见的需求,特别是在处理时间序列数据或进行周期性分析时。本文将深入探讨如何利用Oracle SQL的功能来实现这一目标,包括理解Oracle中的日期函数、如何计算特定...
Oracle是世界上最广泛使用的数据库管理系统之一,它提供了丰富的SQL语法和数据对象来支持高效的数据管理和处理。本文将深入探讨Oracle中的SQL语法和数据对象。 一、数据控制语言(DML) 1. 插入(INSERT):INSERT...
Oracle数据库提供了序列(Sequences)机制来实现这个功能。下面将详细介绍如何在Oracle中创建主键序列的脚本以及如何使用它们。 一、创建序列脚本 在Oracle中,创建一个序列可以使用`CREATE SEQUENCE`语句。下面是...