`
Everyday都不同
  • 浏览: 723529 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

利用sql求时间序列(含天、小时、分、秒) (Oracle)

阅读更多

事情的起因是要改善代码~~~

原先是在一个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的语法也蛮不错的。

  • 大小: 5 KB
  • 大小: 2.8 KB
  • 大小: 3 KB
  • 大小: 6.8 KB
1
0
分享到:
评论

相关推荐

    oracle 不用新建序列 重置序列(从1开始增长)

    在Oracle数据库管理中,序列是一种常用的对象,用于自动产生唯一的数值。序列通常被用来作为主键或唯一标识符,特别是在自动生成记录ID时。然而,有时候我们可能需要重置序列,使其从特定值开始,例如从1开始增长,...

    Oracle Sql语句转换成Mysql Sql语句

    在数据库管理领域,Oracle SQL和MySQL SQL是两种广泛使用的SQL方言,它们在语法和功能上存在一定的差异。当需要将一个基于Oracle SQL的应用程序迁移到MySQL环境时,就需要进行SQL语句的转换工作。本项目提供了一个...

    sqlserver中创建类似oracle序列的存储过程

    ### SQL Server 中创建类似 Oracle 序列的存储过程 #### 背景介绍 在数据库管理系统(DBMS)中,序列是一种自增的数据结构,常用于自动产生唯一标识符(如ID)。Oracle 数据库提供了非常方便的序列机制,而 SQL ...

    oracle序列创建、修改、删除

    在Oracle数据库中,序列(Sequence)是一种特殊的数据对象,它能自动地生成唯一的整数,通常用于为主键字段提供连续的标识符。序列的使用极大地简化了数据插入过程,特别是对于那些需要保持唯一性的整数字段,如员工...

    sqlserver-oracle 数据类型对照

    - `CURRVAL`和`NEXTVAL`在Oracle中处理序列,SQL Server中使用`IDENT_CURRENT`和`IDENTITY`属性。 - `NULLIF`在Oracle和SQL Server中用于比较并返回NULL。 - `UID`、`SUSER_ID`、`USER_ID`、`USER`、`CURRENT_...

    OracleSQL实例-序列的再创建实例.pdf

    Oracle SQL中的序列(Sequences)是数据库对象,用于生成唯一的整数序列,通常用于自动为表的主键字段提供唯一标识符。在这个实例中,我们将深入理解如何创建、使用和管理Oracle序列,以及如何处理序列的缓存问题。 ...

    oracle sqltuning workshop

    7. **表分区**:大表的分区技术能提升查询效率,尤其对于时间序列数据。学习如何根据业务需求选择合适的分区策略(范围、列表、哈希等)。 8. **并行查询**:通过分配任务到多个处理器,并行查询可以加速大查询的...

    oracle创建表,索引,表空间,触发器,schema用户,序列的Sql文

    在Oracle数据库管理中,SQL(Structured Query Language)是用于创建、操作和管理数据库的主要工具。以下将详细讲解标题和描述中涉及的各个知识点: 1. **创建表**:在Oracle中,使用`CREATE TABLE`语句来定义新的...

    批量修改Oracle序列值的存储过程

    在Oracle数据库中,序列(Sequences)是一种自动递增或递减的数字生成器,常用于主键生成或者自增字段。批量修改Oracle序列值的需求可能出现在数据迁移、恢复或测试环境中,确保序列与实际数据匹配。这篇博客分享的...

    深度对比 Oracle与SQL Server

    通过对 Oracle 和 SQL Server 的深度对比,我们可以看出两者在操作系统的支持、版本和发行版、实例和数据库管理、事务一致性与基于时间点的恢复、系统元数据、启动与配置参数、动态视图、存储结构、启动与关闭、...

    Oracle SQL 测试题目

    Oracle SQL 是一种强大的数据库查询语言,广泛用于管理和处理Oracle数据库中的数据。以下是对给定测试题目中涉及的一些关键知识点的详细解释: 1. 统计每个部门员工的数目: 使用 `SELECT` 语句配合 `COUNT(*)` ...

    mysql生成oracle序列

    ### MySQL生成Oracle序列知识点 #### 一、背景与概述 在数据库领域中,不同数据库管理系统(DBMS)之间存在显著差异,比如Oracle与MySQL在处理序列(sequence)的方式上就有本质的不同。Oracle提供了内置的支持来管理...

    ORACLE和SQL语法区别归纳

    Oracle数据库系统与SQL(结构化查询语言)是两个在数据库管理领域中不可或缺的概念,它们有着密切的联系,但也有明显的差异。SQL是一种用于管理和处理关系型数据库的标准语言,而Oracle则是一个具体的数据库管理系统...

    oracle导出序列

    本文将深入探讨如何使用PL/SQL工具来导出Oracle序列,并详细阐述相关的步骤。 首先,让我们了解Oracle序列的基本概念。序列由一系列连续的整数组成,可以设置起始值、增量和最大值等属性。创建序列的基本语法如下:...

    oracle与SQL server的语法差异总结

    Oracle 和 SQL Server 是两种广泛应用的关系型数据库管理系统,它们在语法和功能上存在一定的差异。以下是对两者主要区别的一些详细说明: 1. **伪列 ROWNUM**: 在Oracle中,ROWNUM是一个伪列,用于获取结果集中...

    oracle 建表 建序列

    ### Oracle 创建表与序列知识点详解 #### 一、Oracle创建表的基本语法与示例解析 在Oracle数据库中,创建表是进行数据管理的基础操作之一。下面将通过几个具体实例来详细解析创建表的过程。 ##### 示例1:创建...

    oracle索引、序列和权限设置

    在Oracle数据库管理中,索引、序列和权限设置是三个非常关键的概念,它们分别用于提高数据检索速度、自动生成唯一序列值以及控制数据库资源的访问权限。以下是对这些概念的详细解析,基于提供的实验内容: ### 一、...

    oracle sql 根据年份、周数取日期

    在Oracle SQL中,根据年份和周数获取特定日期是一个常见的需求,特别是在处理时间序列数据或进行周期性分析时。本文将深入探讨如何利用Oracle SQL的功能来实现这一目标,包括理解Oracle中的日期函数、如何计算特定...

    Oracle中常用SQL语法和数据对象.doc

    Oracle是世界上最广泛使用的数据库管理系统之一,它提供了丰富的SQL语法和数据对象来支持高效的数据管理和处理。本文将深入探讨Oracle中的SQL语法和数据对象。 一、数据控制语言(DML) 1. 插入(INSERT):INSERT...

    oracle 创建id主键序列 脚本

    Oracle数据库提供了序列(Sequences)机制来实现这个功能。下面将详细介绍如何在Oracle中创建主键序列的脚本以及如何使用它们。 一、创建序列脚本 在Oracle中,创建一个序列可以使用`CREATE SEQUENCE`语句。下面是...

Global site tag (gtag.js) - Google Analytics