一个表里,一列数据:
00000001
00000002
00000003
...
...
20000001
20000001
...
21000099
33000001
33000002
...
55000001
55000002
...
59999999
80000000
80000001
...
简单说,这一列数据中,是大量连续的,但是在某些地方,会突然出现100000到30000000的跨度。
那么,怎么取出,大于10000跨度的某一行(第一次大于100000跨度大一行,或者第二次等等),大于3000000跨度的以如此。
用什么语句或者脚本,给个思路也行。 看不懂比如0楼的例子,33000001是第一个突然的跨度,它比之前一行的21000099突然跨出一大截。
如何用sql写法,如何发现这个33000001?跨度啥意思?两行之差?
写个存储过程应该就行了。。。说数据库, Oracle的话有办法, 其他的就要写程序了.
PL/SQL可以用cursor 来做.sql估计没法解决这个问题
直接查询全表,然后在本地做这个操作不要沉啊不要沉.............
如果塞到临时表里,多加一个序号,按照序号逐行检测是不是下一行比前一行大1,而不是大了很多(大于一个变量)。
不过这么做感觉太野蛮了,遍历全表,效率很差。没看懂,等高人,学姿势不是oracle,是sybase....我不想添加一个子过程啊
一个表里,一列数据:
00000001
00000002
00000003
...
...
...
21000099
33000001
33000002
...
55000001
55000002
...
59999999
80000000
80000001
...
简单说,这一列数据中,是大量连续的,但是在某些地方,会突然出现100000到30000000的跨度。
那么,怎么取出,大于10000跨度的某一行(第一次大于100000跨度大一行,或者第二次等等),大于3000000跨度的以如此。
用什么语句或者脚本,给个思路也行。
关于跨度那段我理解不能
标红是你写错了么? Post by 毒邪 (2012-07-18 18:17)
是写错的。不过真是环境的确这样,有重复的数据。
目前就是要找到那个“跨度”。简单说就是1,2,3,4,15,16,17这些数,要找到4或者15,因为4和15之间差距不是1.临时表加行号后排序?oracle的话,这样也许可以:
select t1.* from t t1, t t2 where t1.rownum = t2.rownum+1 and t1.数据列 > t2.数据列 + n (n是阈值,你自己定义) order by t1.数据列先给它们加上rownumber,然后找合适结果的rownumber最小值.这样?相邻两条记录取值辨断是否相差1,然后一波带走。 乱说的
没有序列的表大家都没辙
然后你又嫌弃做张临时表产生序列判断太耗资源- -
呵呵~~~ Post by ztbsuper (2012-07-18 18:20)
有没有别的办法,实表有几百万行数据....临时表加序号也会很慢啊。
有没有办法,比如同一个表,自己和自己关联,加各种函数去判断找出...楼主的意思应该是
找出存在某字段值差值较大现象的相邻两条记录中的第二条
需要同时访问同一张表的两条记录,SQL貌似没这功能给楼主一个思路
假设这一列数据是从a开始的
因为你要查询的最小跨度是10000,你可以设置一个9999的间距
每次的value从a开始
1 查询该列值为value的数据
2 如果value存在,对value+9999
3 如果value不存在,查询大于value的最小值。该值作为结果之一,并且将value设置为该值。继续
oracle的话,这样也许可以:
select t1.* from t t1, t t2 where t1.rownum = t2.rownum+1 and t1.数据列 > t2.数据列 + n (n是阈值,你自己定义) order by t1.数据列lz啊,这个问题不难啊……你用游标做循环,然后定义一个标准,发现第二个数字比前面一个大太多就把这个数字加到一个表里面不就完了?因为这个只做了减法,所以性能不会很差……