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