0 0

oracle数据库 求一条sql15

有以下需求: 数据库为oracle
有一张表  tel(varchar2),up_time(timestamp)

数据: 1,2014-3-31 12:20:30
1,2014-3-31 12:20:35
1,2014-3-31 12:20:36
1,2014-3-31 12:21:01
1,2014-3-31 12:21:03
1,2014-3-31 12:21:05
1,2014-3-31 12:21:11
1,2014-3-31 12:21:15
1,2014-3-31 12:21:18

想得到以下数据:
1,2014-3-31 12:20:30
1,2014-3-31 12:20:35
1,2014-3-31 12:21:01
1,2014-3-31 12:21:11
1,2014-3-31 12:21:18
(大体意思就是以查询出来的第一条数据为基准 找到下一条间隔时间大于等于5秒的数据,然后以下一条数据为基准,再找到它的下一条大于等于5秒的数据,以此类推)
求大神解~~~~~~~

问题补充:初始化脚本:

create table t_test
(
   tel            VARCHAR2(12)            not null,
   up_time          TIMESTAMP          not null
);
insert into t_test(tel,up_time) values('1', to_timestamp('2014-3-31 12:20:30','yyyy-MM-dd HH:mi:ss'));
insert into t_test(tel,up_time) values('1', to_timestamp('2014-3-31 12:20:35','yyyy-MM-dd HH:mi:ss'));
insert into t_test(tel,up_time) values('1', to_timestamp('2014-3-31 12:20:36','yyyy-MM-dd HH:mi:ss'));
insert into t_test(tel,up_time) values('1', to_timestamp('2014-3-31 12:21:01','yyyy-MM-dd HH:mi:ss'));
insert into t_test(tel,up_time) values('1', to_timestamp('2014-3-31 12:21:03','yyyy-MM-dd HH:mi:ss'));
insert into t_test(tel,up_time) values('1', to_timestamp('2014-3-31 12:21:05','yyyy-MM-dd HH:mi:ss'));
insert into t_test(tel,up_time) values('1', to_timestamp('2014-3-31 12:21:11','yyyy-MM-dd HH:mi:ss'));
insert into t_test(tel,up_time) values('1', to_timestamp('2014-3-31 12:21:15','yyyy-MM-dd HH:mi:ss'));
insert into t_test(tel,up_time) values('1', to_timestamp('2014-3-31 12:21:18','yyyy-MM-dd HH:mi:ss'));
commit;
2014年3月31日 16:34

3个答案 按时间排序 按投票排序

0 0

采纳的答案

select x.*,sys_connect_by_path(to_char(x.up_time,'yyyy-MM-dd hh:mi:ss'), '/' )  from (
  select a.*,(select min(up_time) from t_test b where b.up_time >= a.add_time) next_time
  from(
         select t.*,t.up_time + 1/(24*60*60)*5 add_time from t_test t
  ) a
) x
start with x.up_time = to_date('2014-03-31 12:20:30','yyyy-MM-dd hh:mi:ss')
connect by prior x.next_time = x.up_time


主要思路是通过oracle的connect by 递归实现,但实现的时候有个问题,就是你的表缺少字段来连接上下记录,所以要自己模拟

上面sql主要分成以下几个步骤:
1.
select t.*,t.up_time + 1/(24*60*60)*5 add_time from t_test t

增加一列表示up_time加上5秒是哪个时间,结果如果下:
引用

1 2014-03-31 12:20:30 2014-03-31 12:20:35
1 2014-03-31 12:20:35 2014-03-31 12:20:40
1 2014-03-31 12:20:36 2014-03-31 12:20:41
1 2014-03-31 12:21:01 2014-03-31 12:21:06
1 2014-03-31 12:21:03 2014-03-31 12:21:08
1 2014-03-31 12:21:05 2014-03-31 12:21:10
1 2014-03-31 12:21:11 2014-03-31 12:21:16
1 2014-03-31 12:21:15 2014-03-31 12:21:20
1 2014-03-31 12:21:18 2014-03-31 12:21:23


2.
select a.*,(select min(up_time) from t_test b where b.up_time >= a.add_time) next_time
  from(
         select t.*,t.up_time + 1/(24*60*60)*5 add_time from t_test t
  ) a

在步骤一的基础上,增加一列next_time,即根据步骤一计算出的列add_time(也就是up_time加上5秒的值)来得到此add_time与原表数据中的up_time哪个最近。结果如下:
引用

1 2014-03-31 12:20:30 2014-03-31 12:20:35 2014-03-31 12:20:35
1 2014-03-31 12:20:35 2014-03-31 12:20:40 2014-03-31 12:21:01
1 2014-03-31 12:20:36 2014-03-31 12:20:41 2014-03-31 12:21:01
1 2014-03-31 12:21:01 2014-03-31 12:21:06 2014-03-31 12:21:11
1 2014-03-31 12:21:03 2014-03-31 12:21:08 2014-03-31 12:21:11
1 2014-03-31 12:21:05 2014-03-31 12:21:10 2014-03-31 12:21:11
1 2014-03-31 12:21:11 2014-03-31 12:21:16 2014-03-31 12:21:18
1 2014-03-31 12:21:15 2014-03-31 12:21:20
1 2014-03-31 12:21:18 2014-03-31 12:21:23


3.这就可以根据步骤二得到的表结构进行oracle递归查询了,查询条件就是根据next_time=up_time来进行

2014年4月01日 11:07
0 0

为什么不在TABLE Design的时候考虑扩展一个Column出来保存与上一条Record的时间差呢?

2014年4月01日 09:51
0 0

没有想到好的方法,
但是为什么非要用sql呢,可以用程序处理,如果数据量不大的话,可以一次读出,在程序中操作,速度也很快。

2014年3月31日 22:24

相关推荐

    Oracle数据库的SQL语句的优化

    优化器根据不同的情况为每条SQL语句生成一种或多种执行计划,并从中选择最优方案执行。理解优化器的工作原理对于提高数据库性能至关重要。 1. **优化器的优化方式** - **基于规则的优化方式(Rule-Based ...

    labview 调用oracle数据库

    假设我们已经创建了"Employee"表,可以这样插入一条记录: ```sql INSERT INTO Employee (ID, Name, Salary) VALUES (1, '张三', 5000.0); ``` 在LabVIEW中,对应的VI会包含一个"构建SQL"节点和一个"执行SQL(无...

    省市县oracle数据库sql

    从给定的文件信息中,我们可以提取到关于Oracle数据库中SQL操作的重要知识点,特别是与创建表、定义主键约束以及插入数据相关的操作。下面将详细解释这些知识点。 ### 创建表 在Oracle数据库中,`CREATE TABLE`...

    Oracle数据库Sql语句详解大全

    写一条SELECT查询语句 在查询中使用表达式、运算符 对空值的处理 对查询字段起别名 查询字段的连接 第二章 条件查询 WHERE条件查询 在查询中使用表达式、运算符 使用LIKE、BETWEEN、IN进行模糊查询 第三章 单行...

    Oracle数据库SQL和PL SQL实例教程.rar

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统之一,SQL(Structured Query Language)是与数据库交互的语言,而PL/SQL则是Oracle特有的过程化语言,用于编写更复杂的数据库操作和应用程序。本教程结合SQL...

    excel导入数据到Oracle数据库

    1. **安装PL/SQL Developer**:首先需要安装PL/SQL Developer工具,这是一个功能强大的Oracle数据库开发工具,支持数据导入导出等功能。 2. **安装ODBC驱动程序**:为了能够通过ODBC导入器连接到Oracle数据库,需要...

    Oracle数据库基础教程-参考答案

    Oracle数据库是一种广泛应用于企业的关系型数据库管理系统,由Oracle公司开发,以其高效、稳定和强大的功能著称。本节将深入解析Oracle数据库的基础知识。 1. 数据库概念: 数据是数据库中存储的基本元素,常以...

    java代码oracle数据库批量插入

    - **填充参数并添加到批处理**: 循环遍历列表中的每一条记录,并使用`pst.setString()`方法设置每个`?`占位符对应的值。然后通过`pst.addBatch();`将当前的SQL语句添加到批处理队列中。 ```java for (int i = 0; i...

    Oracle数据库服务器IO高的分析方案.docx

    - **AWR报告**:Oracle数据库自带的一种性能诊断工具,能够收集关于数据库实例的工作负载信息,包括CPU使用率、等待事件、IO统计等。 **示例分析:** 假设从AWR报告中发现某条SQL语句在短时间内执行多次,且每次...

    Oracle数据库操作

    在PL/SQL中,可以声明一个游标,执行SQL查询,并通过循环遍历游标来显示记录集中的每一条信息。 2. **子程序_转换到SQL时间**: 数据库中的时间数据通常以特定的格式存储,例如TIMESTAMP或DATE类型。在处理这些...

    oracle数据库常见99条的查询语句

    ### Oracle数据库常见查询语句详解 #### 1. 基础查询 - **SQL语句**: `SELECT * FROM emp;...通过这些示例,读者可以更深入地了解如何使用SQL语言来处理Oracle数据库中的数据,从而实现高效的数据管理。

    基于C#连接Oracle数据库Oracle.ManagedDataAccess

    在`while`循环中,我们可以遍历并处理每一条记录。 除了查询,Oracle.ManagedDataAccess库还支持存储过程的调用、事务处理、参数化查询等功能,可以满足各种复杂的数据库操作需求。 总的来说,Oracle....

    ORACLE数据库优化之SQL语句的并行处理.pdf

    SQL语句的并行处理指的是将一条SQL语句分解成多个子任务,利用多处理器或多核架构,在不同的CPU上并行执行这些子任务,从而显著减少响应时间和提高数据库的吞吐量。 并行处理的优势在处理大型数据集时尤为明显,如...

    oracle数据库性能优化.pdf

    总的来说,Oracle数据库性能优化是一个全面的过程,涵盖硬件配置、软件设置、SQL优化、存储策略等多个方面。需要根据系统负载、业务需求以及资源状况进行综合分析,持续监控和调整,以实现最优的数据库运行状态。...

    C#连接Oracle数据库

    访问Oracle数据库主要通过执行SQL语句来实现。`OracleCommand`类用于创建和执行命令,例如查询、插入、更新或删除数据。下面是一个执行SELECT查询的例子: ```csharp OracleCommand cmd = new OracleCommand(...

    oracle数据库从入门到精通

    对于想要深入学习Oracle数据库的用户来说,本书《Oracle数据库从入门到精通》提供了一条清晰的学习路径。书中的内容被设计成能够使读者从基础开始逐渐深入到高级话题。书中不仅涵盖了基础概念,还包括了实际应用开发...

    Oracle数据库从入门到精通

    这份“Oracle数据库从入门到精通”的资料,旨在为初学者提供一条系统的学习路径,帮助他们从零开始掌握Oracle数据库的基础知识和高级应用。 一、Oracle数据库基础 Oracle数据库的核心是SQL(结构化查询语言),它...

    Oracle批处理:使用C# 自带Oracle驱动一次执行多条Sql语句

    接下来,使用CommandText属性添加SQL语句,可以是一条或多条。为了实现批处理,我们可以使用分号(`;`)作为每条SQL语句的分隔符。例如: ```csharp OracleCommand command = new OracleCommand(); command....

    如何通过txt文件批量导入数据到oracle数据库

    在IT行业中,数据库管理是至关重要的任务之一,Oracle数据库作为全球广泛使用的数据库系统,经常需要处理大量的数据导入工作。在面对存储着大量记录的文本文件(如TXT)时,手动一条条输入数据显然是低效且易出错的...

    ORACLE数据库中SQL优化解析.pdf

    在ORACLE数据库中,SQL优化是指通过一系列手段来提高SQL语句的执行速度,以减少对系统资源的消耗,提高整体性能。 首先,了解SQL语句的执行过程是进行优化的前提。SQL语句的执行主要分为四个阶段:语法阶段、优化...

Global site tag (gtag.js) - Google Analytics