一個(gè)表里,一列數(shù)據(jù):
00000001
00000002
00000003
...
...
20000001
20000001
...
21000099
33000001
33000002
...
55000001
55000002
...
59999999
80000000
80000001
...
簡(jiǎn)單說(shuō),這一列數(shù)據(jù)中,是大量連續(xù)的,但是在某些地方,會(huì)突然出現(xiàn)100000到30000000的跨度。
那么,怎么取出,大于10000跨度的某一行(第一次大于100000跨度大一行,或者第二次等等),大于3000000跨度的以如此。
用什么語(yǔ)句或者腳本,給個(gè)思路也行。 看不懂比如0樓的例子,33000001是第一個(gè)突然的跨度,它比之前一行的21000099突然跨出一大截。
如何用sql寫法,如何發(fā)現(xiàn)這個(gè)33000001?跨度啥意思??jī)尚兄睿?
寫個(gè)存儲(chǔ)過(guò)程應(yīng)該就行了。。。說(shuō)數(shù)據(jù)庫(kù), Oracle的話有辦法, 其他的就要寫程序了.
PL/SQL可以用cursor 來(lái)做.sql估計(jì)沒(méi)法解決這個(gè)問(wèn)題
直接查詢?nèi),然后在本地做這個(gè)操作不要沉啊不要沉.............
如果塞到臨時(shí)表里,多加一個(gè)序號(hào),按照序號(hào)逐行檢測(cè)是不是下一行比前一行大1,而不是大了很多(大于一個(gè)變量)。
不過(guò)這么做感覺(jué)太野蠻了,遍歷全表,效率很差。沒(méi)看懂,等高人,學(xué)姿勢(shì)不是oracle,是sybase....我不想添加一個(gè)子過(guò)程啊
一個(gè)表里,一列數(shù)據(jù):
00000001
00000002
00000003
...
...
...
21000099
33000001
33000002
...
55000001
55000002
...
59999999
80000000
80000001
...
簡(jiǎn)單說(shuō),這一列數(shù)據(jù)中,是大量連續(xù)的,但是在某些地方,會(huì)突然出現(xiàn)100000到30000000的跨度。
那么,怎么取出,大于10000跨度的某一行(第一次大于100000跨度大一行,或者第二次等等),大于3000000跨度的以如此。
用什么語(yǔ)句或者腳本,給個(gè)思路也行。
關(guān)于跨度那段我理解不能
標(biāo)紅是你寫錯(cuò)了么? Post by 毒邪 (2012-07-18 18:17)
是寫錯(cuò)的。不過(guò)真是環(huán)境的確這樣,有重復(fù)的數(shù)據(jù)。
目前就是要找到那個(gè)“跨度”。簡(jiǎn)單說(shuō)就是1,2,3,4,15,16,17這些數(shù),要找到4或者15,因?yàn)?和15之間差距不是1.臨時(shí)表加行號(hào)后排序?oracle的話,這樣也許可以:
select t1.* from t t1, t t2 where t1.rownum = t2.rownum+1 and t1.數(shù)據(jù)列 > t2.數(shù)據(jù)列 + n (n是閾值,你自己定義) order by t1.數(shù)據(jù)列先給它們加上rownumber,然后找合適結(jié)果的rownumber最小值.這樣?相鄰兩條記錄取值辨斷是否相差1,然后一波帶走。 亂說(shuō)的
沒(méi)有序列的表大家都沒(méi)轍
然后你又嫌棄做張臨時(shí)表產(chǎn)生序列判斷太耗資源- -
呵呵~~~ Post by ztbsuper (2012-07-18 18:20)
有沒(méi)有別的辦法,實(shí)表有幾百萬(wàn)行數(shù)據(jù)....臨時(shí)表加序號(hào)也會(huì)很慢啊。
有沒(méi)有辦法,比如同一個(gè)表,自己和自己關(guān)聯(lián),加各種函數(shù)去判斷找出...樓主的意思應(yīng)該是
找出存在某字段值差值較大現(xiàn)象的相鄰兩條記錄中的第二條
需要同時(shí)訪問(wèn)同一張表的兩條記錄,SQL貌似沒(méi)這功能給樓主一個(gè)思路
假設(shè)這一列數(shù)據(jù)是從a開(kāi)始的
因?yàn)槟阋樵兊淖钚】缍仁?0000,你可以設(shè)置一個(gè)9999的間距
每次的value從a開(kāi)始
1 查詢?cè)摿兄禐関alue的數(shù)據(jù)
2 如果value存在,對(duì)value+9999
3 如果value不存在,查詢大于value的最小值。該值作為結(jié)果之一,并且將value設(shè)置為該值。繼續(xù)
oracle的話,這樣也許可以:
select t1.* from t t1, t t2 where t1.rownum = t2.rownum+1 and t1.數(shù)據(jù)列 > t2.數(shù)據(jù)列 + n (n是閾值,你自己定義) order by t1.數(shù)據(jù)列l(wèi)z啊,這個(gè)問(wèn)題不難啊……你用游標(biāo)做循環(huán),然后定義一個(gè)標(biāo)準(zhǔn),發(fā)現(xiàn)第二個(gè)數(shù)字比前面一個(gè)大太多就把這個(gè)數(shù)字加到一個(gè)表里面不就完了?因?yàn)檫@個(gè)只做了減法,所以性能不會(huì)很差……