oracle数据库 求一条sql

问题描述

有以下需求: 数据库为oracle有一张表 tel(varchar2),up_time(timestamp)数据: 1,2014-3-31 12:20:301,2014-3-31 12:20:351,2014-3-31 12:20:361,2014-3-31 12:21:011,2014-3-31 12:21:031,2014-3-31 12:21:051,2014-3-31 12:21:111,2014-3-31 12:21:151,2014-3-31 12:21:18想得到以下数据:1,2014-3-31 12:20:301,2014-3-31 12:20:351,2014-3-31 12:21:011,2014-3-31 12:21:111,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;

解决方案

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) xstart 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秒是哪个时间,结果如果下:引用12014-03-31 12:20:302014-03-31 12:20:3512014-03-31 12:20:352014-03-31 12:20:4012014-03-31 12:20:362014-03-31 12:20:4112014-03-31 12:21:012014-03-31 12:21:0612014-03-31 12:21:032014-03-31 12:21:0812014-03-31 12:21:052014-03-31 12:21:1012014-03-31 12:21:112014-03-31 12:21:1612014-03-31 12:21:152014-03-31 12:21:2012014-03-31 12:21:182014-03-31 12:21:232.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哪个最近。结果如下:引用12014-03-31 12:20:302014-03-31 12:20:352014-03-31 12:20:3512014-03-31 12:20:352014-03-31 12:20:402014-03-31 12:21:0112014-03-31 12:20:362014-03-31 12:20:412014-03-31 12:21:0112014-03-31 12:21:012014-03-31 12:21:062014-03-31 12:21:1112014-03-31 12:21:032014-03-31 12:21:082014-03-31 12:21:1112014-03-31 12:21:052014-03-31 12:21:102014-03-31 12:21:1112014-03-31 12:21:112014-03-31 12:21:162014-03-31 12:21:1812014-03-31 12:21:152014-03-31 12:21:2012014-03-31 12:21:182014-03-31 12:21:233.这就可以根据步骤二得到的表结构进行oracle递归查询了,查询条件就是根据next_time=up_time来进行
解决方案二:
为什么不在TABLE Design的时候考虑扩展一个Column出来保存与上一条Record的时间差呢?
解决方案三:
没有想到好的方法,但是为什么非要用sql呢,可以用程序处理,如果数据量不大的话,可以一次读出,在程序中操作,速度也很快。

时间: 2025-01-27 18:44:18

oracle数据库 求一条sql的相关文章

求oracle数据库的分页显示sql语句

问题描述 求oracle数据库的分页显示sql语句 求大神告知oracle数据库的分页显示sql语句,用rownum查不到 解决方案 http://www.cnblogs.com/xiaopang2010/archive/2012/07/23/2604880.htmlhttp://www.2cto.com/database/201304/206296.html 解决方案二: String querySql = ""; querySql += "select x.* from

求一条sql语句,单表查询的

问题描述 求一条sql语句,单表查询的 表结构 (姓名,课程,成绩) 现在求获的该表总成绩最高学员的名字 解决方案 mysql 数据库select sum(成绩) as t from table group by 姓名 order by t limit 0,1 oracle数据库 select * from (select sum(成绩) as t from table group by 姓名 order by t) WHERE ROWNUM<=1 sqlserver数据库 select top

把Oracle数据库移植到Microsoft SQL Server 7.0

oracle|server|数据|数据库  把Oracle数据库移植到Microsoft SQL Server 7.0 摘要:本文是为那些想把自己的Oracle应用程序转换为Microsoft SQL Server应用程序的开发人员编写的.本文描述了一个成功的转换所需要的工具.过程和技术.同时强调了建立高性能.高度并行的SQL Server应用程序的基本的设计要素. 本文的读者应该具有: Oracle关系型数据管理系统(RDBMS)的坚实基础. 普通数据库管理知识. 熟悉Oracle SQL和P

oracle 数据库...-oracle 数据库插入一条数据,某字段如何自动递增1

问题描述 oracle 数据库插入一条数据,某字段如何自动递增1 oracle 数据库插入一条数据,某字段如何自动递增1,oracle 数据库插入一条数据,某字段如何自动递增1,在线等.急急急.求大指点 解决方案 1,使用序列 2,手动使用变量++然后执行插入数据库记录 解决方案二: oracle 字段递增 表插入数据,id自动增1 解决方案三: Oracle里有序列,使用序列来实现 解决方案四: 序列: 是oacle提供的用于产生一系列唯一数字的数据库对象. l 自动提供唯一的数值 l 共享对

Oracle数据库如何搜集指定SQL的执行计划和解决过程中的ORA-00904错误

  Oracle 数据库如何搜集指定SQL的执行计划和解决过程中的ORA-00904错误 (版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处;否则请与本人联系,违者必究) 如何收集指定SQL的执行计划对开发人员来说非常重要的,这里记录下基础的收集方式,以便查阅和其他人参考. 1. 链接到sqlplus,如下图 2. 执行下面两个的命令之一 set autotrace on; (说明:打开自动分析统计,并显示SQL语句的运行结果) 3. 输入并执行要搜集执行计划的SQL语句

sql-急求一条SQL , 请大神进来看看

问题描述 急求一条SQL , 请大神进来看看 我要查询出student_class中,同一个studentId,而它的classId数量大于5的student信息, 有一个student_Info表和class_info表作关系... http://b.hiphotos.baidu.com/zhidao/wh%3D600%2C800/sign=c56a0c5b820a19d8cb568c0303caaeb3/64380cd7912397dda891cdee5b82b2b7d1a2876b.jpg

数据-求教一条SQL语句实现功能的问题

问题描述 求教一条SQL语句实现功能的问题 (第一遍问的有写不对) SQL语句是否可以实现这样的功能: (设有表A.B,A中有数据f1和f2) select f1 from A where f2='aa'; 当f1=1时,执行SELECT 语句1 当f1=2时,执行select语句2 这样的话如何实现? 解决方案 select * from 表A where exists(select 1 from 表C WHERE 表C.字段=1) union select * from 表B where e

Oracle 数据库的分页查询sql语句

oracle 数据库教程的分页查询sql语句   oracle       select * from (select rownum r,t1.* from 表名称 t1 where rownum < m + n) t2 where t2.r >= m 例如从表sys_option(主键为sys_id)中从10条记录还是检索20条记录,语句如下: select * from (select rownum r,t1.* from sys_option where rownum < 30 )

oracle中得到一条SQL语句的执行时间的两种方式_oracle

oracle中如果需要得到一条SQL语句的执行时间可以用如下2种方式 复制代码 代码如下: SQL> set timing on; SQL> select count(*) from wea; COUNT(*) ---------- 39490 已用时间: 00: 00: 00.06 SQL> select sql_text, elapsed_time from v$sql 2 where sql_text like 'select count(*) from wea'; 未选定行 已用