有一段樂譜字串如下:
1265535165656312653126312312
用sql怎樣能快事找到預先指定的n位的出現次數最多的字串,如n=3時,
結果為312。
因實際資料量很大,故要考慮效率問題,使用窮舉不可行,求教!
uj5u.com熱心網友回復:
麻煩啊,別用sql了吧,取出來用python java 什么的,感覺可行性大一些,等大神來吧
uj5u.com熱心網友回復:
這應該也算是窮舉法了吧。其他的就想不到了。with t1 as
(select '1265535165656312653126312312' c1 from dual)
, t2 as
(select rownum rn from dual connect by rownum<=(select length(c1)-2 from t1))
select * from (
select substr(c1, rn, 3) s, count(*) c
from t1, t2
group by substr(c1, rn, 3)
order by count(*) desc
) aa
where rownum=1
uj5u.com熱心網友回復:
是啊,窮舉效率有些問題,不好弄。另外用程式處理也存在效率問題,沒想到好的演算法啊
uj5u.com熱心網友回復:
還是感謝了,但效率可能有問題。uj5u.com熱心網友回復:
原來有高手指點過找最長累壞字串的演算法,但不知道能否應用到我提的這個問題中,如下,基本思路就是劃如下表格,標顏色的部分比較一下,效率奇高!求高手指教!
uj5u.com熱心網友回復:
不說n=3了,就說n=1找最大值,那也是要拆分的。這樣的字串出現在資料庫內的一個欄位內不拆開成若干個欄位,什么演算法也不好使; 拆分肯定會影響效率的。uj5u.com熱心網友回復:
但拆分后怎么處理呢?另外有無數個這種字串,全部變成列嗎,不可行吧?uj5u.com熱心網友回復:
with t1 as
(select '1265535165656312653126312312' c1 from dual)
, t2 as(select substr(c1, level, 3) s, regexp_count(c1, substr(c1, level, 3)) c from t1
connect by level <= length(c1) - 2 order by c desc)
select * from t2 where rownum=1;
uj5u.com熱心網友回復:
