oracle 查询不连续的值?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 查询不连续的值?相关的知识,希望对你有一定的参考价值。
有一字段是文件编号,docNumber, 正常是从1开始的,每次编新文件时,会找数据库中最大的,再加1,就是自动生成当前的编号。
但是现在有个问题,有的文件被删除了,比如30号文件被删除了,现在自动生成的逻辑只能出现最大值,比如40号,我想问,怎么才能查出从1到40中,第一个中断的数字?
返回值就是中断的那个不存在的数字,你把函数里面的表名和字段名替换成你的表
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语句调用这个函数就可以了。
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相同的值出现了三次,说明有三天是连续的,如果出现了多次,就说明多天连续。
reptype需要一致,分上下两个表上面显示连续三天最大的一条,下面显示具体的三条信息
以上是关于oracle 查询不连续的值?的主要内容,如果未能解决你的问题,请参考以下文章
ORACLE 查询某条数据的相邻两条数据(注ID可能是不连续的)