oracle数据行之间某字段是否连续判断

T-yio 发布于 2016/05/25 17:39
阅读 1K+
收藏 0

表里有一个字段,我如何判断数据行之间,该字段的值是否连续?

我现在用的方法是:用order by 保证该字段的值是从小到大的,然后再在java程序里循环琢一判断前一个值与后一个值是否相差1。相差1,我就记录下来,直到连续达到一个数量时,停止。

请问是否有更简单,性能更好一点的处理方法,数据行与行之间的字段值比较?谢谢

加载中
0
jolphin
jolphin
用分析函数lead、lag,利用上一行和下一行进行比较
0
martinyuan
martinyuan
可以试试这个思路,多线程分段,计算预估数据,然后sum,然后比较,如果不一致证明内部有断,递归往复
sss6666
sss6666
回复 @T-yio : 无论是用函数,还是自己写存储过程,都需要mysql进行运算,那么mysql的性能自然会下降,毕竟是做存储的。
T
T-yio
回复 @Isaac-c : 谢谢,另外,为什么“用mysql显然效率会有问题”?
sss6666
sss6666
回复 @T-yio : 他的意思是,你如果一个循环下去,那么会从1……N,但是如果用两个线程的方法,会是1……二分之N 二分之N……N 并行计算,显然运行时间会缩短。我觉得多线程的方法是比较合理的。用mysql实现这个功能显然效率会有问题。
T
T-yio
听不懂。。
0
martinyuan
martinyuan
另外:可以建立一个连续表min-max,再俩表关联查询
T
T-yio
嗯,但我仍然要先取出数据来,再计算是否连续。然后获取min和max,再存入min-max表。嗯,简化了我的一些操作。
0
IdleMan
IdleMan
SELECT rn CODE
  from (SELECT ROWNUM rn
          from dual
        CONNECT BY ROWNUM <= (SELECT MAX(space_sequence) FROM t)
        MINUS
        SELECT space_sequence rn
          FROM T)
 WHERE rn >= (SELECT MIN(space_sequence) FROM t)



0
Fanxme
Fanxme

第一步
若ID以1开始,取count

select count(1) 
from (
  select id,rownum from t_tmp 
  order by id
)
where id=rownum

若ID不以1开始

// 获取最小值min_id
select min(id) from t_tmp;

select count(1) 
from (
  select id-min_id+1,rownum from t_tmp 
  order by id
)
where id=rownum


第二步
获取所有数量

select count(1) from t_tmp


将第一步和第二步的count值进行比较

T
T-yio
谢谢,个人觉得我这个问题目前采用lead()函数更方便点
0
Shazi199
Shazi199
取min&max之差、去重取count,如果两个值不一样不就是不连续了吗
T
T-yio
对的,我之后就是用了这个算法。后面直接在oracle里采用了lead()函数
0
lyle_luo
lyle_luo
先排序,然后用游标循环比较
0
lyle_luo
lyle_luo
lead(exp_str,offset,defval) over(order by col1)计算差值或者用row_number()
T
T-yio
嗯,我再加上我的一些条件判断。这个方式不错
0
陈文锦的秘密
陈文锦的秘密

1, 先内部排序.

2, SELECT you_filed - ROWNUM AS DIFF_NUM (DIFF_NUM就是每行与rownum的差值, 如果 you_filed是连续的,那么这个差值是个定值, 否则会产生多个值.)


T
T-yio
嗯,我使用了oracle的分析函数,lead(),然后找到那个我要的差值
0
张林
张林
末尾序号-开始序号=?count(*)
T
T-yio
嗯,有使用过这种方法,在java里,比我之前的好
返回顶部
顶部