序运算,找出不符合连续递增的异常

【问题】

ID    DDATE
1     2013/5/7
2     2013/8/6
3     2013/6/12
4     2013/12/1
一个表当中  ID  1  2  3  4 这样,时间也应该是从小到大,现在想把时间不是从小到大的找出来。 比如:2   2013/8/6和3  2013/6/12  就不对,把这两条找出来 

【回答】

       按照问题描述,可能有两种情况,一是只比较相邻记录;二是比较当前记录与前后所有记录(如当3比2大但比1小时,应将1 2 3都查出来),在ORACLE中实现这两种情况都要借助窗口函数使用子查询来完成,分别可以这样写:

(1)   只比较相邻:

SELECT id, ddate
  FROM (select id,ddate,
        lag(ddate,1) over(order by id) as d1,
        lead(ddate,1) over(order by id) as d2
        from T0042)
 WHERE d1 > ddate OR d2 < ddate

(2)   比较所有:

WITH T1 as (
select id,ddate,max(ddate)over(order by id) d1
from t0042),T2 as (
select id,min(ddate)over(order by id desc) d2
from t0042)
select T1.id,T1.ddate
from T2,T1
WHERE T1.id=T2.id and (t1.ddate<>T1.d1 or t1.ddate<>T2.d2)

SQL的写法较复杂难懂,其主要是因为集合无序,要用窗口函数拼出子查询造出次序。如果集合有序的话,上述运算就容易写了。用SPL完成这个运算会直观一些,具体脚本如下:

A
1$select ID,DDATE from t0042 order by ID
2=A1.select(DDATE<DDATE[-1] || DDATE>min(DDATE[0,1]))
3=A1.select(DDATE!=max(DDATE[,0]) || DDATE!=min(DDATE[0,]))

A1:sql取数,按照ID排序

A2:比较相邻,选出比上一个DDATE小,或者比后一个DDATE大的记录

A3:比较所有,选出不比前面所有DDATE都大,或者不比后面所有DDATE都小的记录

写好的脚本如何在应用程序中调用,可以参考Java 如何调用 SPL 脚本

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值