Ari*_*x66 3 sql string oracle count
我正在寻找一种方法来找出字符串中最大字符重复的值.
例如 :
String NMCR
-----------------------
akhsdjjjaajjj 6
AABBDDDDDDD 7
Run Code Online (Sandbox Code Playgroud)
我的尝试,以及CTE突出显示的步骤:
with data as (select 'akhsdjjjaajjj' txt from dual
union all
select 'AABBDDDDDDD' txt from dual
),
chars as(select txt,substr(txt,lvl, 1) c, lvl
from data join (select level lvl from dual connect by level < 1000)
on length(data.txt) >= lvl
),
counts as (select txt, c, count(*) cnt
from chars
group by txt, c
)
select txt, max(cnt)
from counts
group by txt;
Run Code Online (Sandbox Code Playgroud)
结果:
TXT MAX(CNT)
akhsdjjjaajjj 6
AABBDDDDDDD 7
一个奇怪的要求,但这是一种方式:
create or replace
function max_repetetive_letter_count (string varchar2) return integer
is
letter_col SYS.KU$_VCNT := SYS.KU$_VCNT(); -- A handy collection type
l_max_count integer;
begin
letter_col.extend(length(string));
for i in 1..length(string) loop
letter_col(i) := substr(string,i,1);
end loop;
select max(letter_count)
into l_max_count
from
( select column_value, count(*) letter_count
from table(letter_col)
group by column_value
);
return l_max_count;
end;
/
Run Code Online (Sandbox Code Playgroud)
用法示例:
SQL> select string, max_repetetive_letter_count(string)
2 from
3 ( select 'ajkhsdjjjaajjj' as string from dual
4 union all
5 select 'AABBDDDDDDD' as string from dual
6 );
STRING MAX_REPETETIVE_LETTER_COUNT(STRING)
-------------- -----------------------------------
ajkhsdjjjaajjj 7
AABBDDDDDDD 7
Run Code Online (Sandbox Code Playgroud)
(注意你的例子中的6是不正确的!)
你也可以使用connect by条款:
SELECT cad,
( SELECT MAX (REGEXP_COUNT (cad, SUBSTR (cad, LEVEL, 1)))
FROM DUAL
CONNECT BY LEVEL < LENGTH (cad))
FROM (SELECT 'akhsdjjjaajjj' cad FROM DUAL
UNION ALL
SELECT 'AABBDDDDDDD' FROM DUAL)
Run Code Online (Sandbox Code Playgroud)
我希望这也有帮助.