oracle 查询不连续的值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 查询不连续的值?相关的知识,希望对你有一定的参考价值。

有一字段是文件编号,docNumber, 正常是从1开始的,每次编新文件时,会找数据库中最大的,再加1,就是自动生成当前的编号。

但是现在有个问题,有的文件被删除了,比如30号文件被删除了,现在自动生成的逻辑只能出现最大值,比如40号,我想问,怎么才能查出从1到40中,第一个中断的数字?

参考技术A 我写了个函数,你试试
返回值就是中断的那个不存在的数字,你把函数里面的表名和字段名替换成你的表

CREATE OR REPLACE FUNCTION GET_BROK RETURN NUMBER IS
RESULT NUMBER;
V_NUM NUMBER;
BEGIN
V_NUM := 0;

FOR CUR IN (SELECT DOCNUMBER FROM TABLE1 ORDER BY DOCNUMBER) LOOP

IF CUR.DOCNUMBER <> V_NUM + 1 THEN
RESULT := V_NUM + 1;
RETURN(RESULT);
END IF;

V_NUM := CUR.DOCNUMBER;

END LOOP;
RESULT := V_NUM + 1;
RETURN(RESULT);
END GET_BROK;追问

能不能麻烦写个SQL呀

追答

函数完全可以,为什么非要用一句话实现这个功能?
创建这个函数后,用一句select语句调用这个函数就可以了。

参考技术B 在表A中保存1到40的连续值,在表B中保存1到40的不连续值,则SQL如下:
select a.id from tableA a where a.id not in (select b.id from tableB b)
参考技术C 查询的!

oracle求查询连续三天的数据

select ids,reptype,YESTERDAYWORKINGTIME,WORKDATE from TMS_YJ_DayH

求reptype别WORKDATE连续三天,YESTERDAYWORKINGTIME>2的数据,例如:DX150LC-CH10,11月14,11月15,11月16,YESTERDAYWORKINGTIME都大于2,那么就显示连续三天中WORKDATE最大的一条数据,明细显示3条;连续4天的话,显示连续4天中WORKDATE最大的一条数据,明细显示最大的3条;连续天数<3的数据不显示
假如:11月11,11月12,11月13,11月20,11月21,11月22都超了2小时如果查询条件是11月10到11月15日那么主表显示11月13,子表显示11月11,11月12,11月13,如果查询条件是11月10到11月30日那么主表显示11月22,子表显示11月20,11月21,11月22

问一下:是要找连续三天最大的,还是最大的数据是连续三天的?如果是最大的数据连续三天的
思路这样,查询所有reptype最大的那三条WORKDATE信息,并且YESTERDAYWORKINGTIME>2,然后将这三条数据中max(WORKDATE)-MIN(WORKDATE)=2的reptype的数据打印出来。
需要嵌套查询。
如果是连续三天的数据中最大的那三条思路要变一下。追问

假如:11月11,11月12,11月13,11月20,11月21,11月22都超了2小时
如果查询条件是11月10到11月15日那么主表显示11月13,子表显示11月11,11月12,11月13,如果查询条件是11月10到11月30日那么主表显示11月22,子表显示11月20,11月21,11月22

追答

OK,要是取主表和子表,可以把下面的SQL改一下就可以了,假设表名为WKTIME:
Select b.reptype, b.workdate,b.* From (Select d.* ,rownum rn From (Select * From wktime where YESTERDAYWORKINGTIME >= 2 order by reptype, workdate desc) d) b, (Select z.reptype,max(z.tpdate) tpdate from (Select distinct a.reptype, a.workdate + rownum tpdate From (Select * From wktime where YESTERDAYWORKINGTIME >= 2 order by reptype, workdate desc) a group by a.reptype, a.workdate + rownum having count(a.workdate + rownum) >= 3) z group by z.reptype )c where b.workdate + b.rn = c.tpdate
and b.reptype = c.reptype;
基本的原理就是把所有YESTERDAYWORKINGTIME >2的数据查询出来,然后按照日期从大到小排一个序,排序完成之后我们使用workdate + rownum进行一下分组,如果按照reptype,workdate + rownum这两列的分组中,count值大于3的,就说明这三天的数据是连续的。
找出连续的三天之后就好处理了,想要那个数据就用这个结果和原来的表进行条件运算就可以了。

追问

workdate + rownum的意义是什么,我这里不太明白

追答

数据被逆序排序之后,会从大到小的排列,ROWNUM是排序的行号。举例如下:
workdate rownum +之后结果
2013/12/26 3 2013/12/292013/12/27 2 2013/12/292013/12/28 1 2013/12/292013/12/20 11 2013/12/312013/12/21 10 2013/12/312013/12/22 9 2013/12/31

如果是连续的那么workdate + rownum的值是相同的,如果workdate + rownum相同的值出现了三次,说明有三天是连续的,如果出现了多次,就说明多天连续。

参考技术A fdeg烦得很 参考技术B reptype需要一致,才能算作workdate连续工作嘛?还是只要表中的workdate连续就可以了?还有你说的明细是什么?明细最大是怎么判断的?追问

reptype需要一致,分上下两个表上面显示连续三天最大的一条,下面显示具体的三条信息

以上是关于oracle 查询不连续的值?的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE 查询某条数据的相邻两条数据(注ID可能是不连续的)

Oracle数据库查询中返回指定的行数例如31到40,主键ID,但不连续,请问这样的语句如何写?

oracle求查询连续三天的数据

Oracle中获取连续的序列号范围的SQL

Oracle根据连续性日期的重复数据取最大或最小值日期

Oracle中要查询出连续出现3天的数据