|
|
有重复的也很容易,构造一个唯一的ID就是了:
WITH input AS
(SELECT doc.extract('/l/text()').getNumberVal() n, count(*) over () cnt,ROWNUM id
FROM
TABLE(xmlSequence(extract(XMLType('<doc><l>'||
replace(:input_data,',','</l><l>')||'</l></doc>'),'/doc/l'))) doc
)
,t2(n1,n2,n3,lvl) AS (
SELECT n,0,0,1 FROM input
UNION ALL
SELECT t2.n1
,DECODE(lvl,1,input.n,t2.n2)
,DECODE(lvl,2,input.n,t2.n3)
,lvl+1
FROM t2,input
WHERE lvl<3 AND input.n NOT IN (n1,n2)
)
,b AS (SELECT n1,n2,n3 from t2 WHERE lvl=3 AND n2*2=n1+n3)
,t(n,str,cnt,lvl,root,all_ids) AS
(SELECT n,','||n||',',cnt,1,n,','||id||','
FROM input
UNION ALL
SELECT input.n,t.str||input.n||',',input.cnt,lvl+1,t.root,t.all_ids||input.id||','
FROM t,input
WHERE lvl<input.cnt
-- AND INSTR(str,','||input.n||',')=0 --- nocycle
AND INSTR(all_ids,','||input.id||',')=0 --- nocycle
AND (lvl<2 OR lvl>=2 AND t.n*2 != input.n + root)
AND NOT EXISTS
(SELECT 1
FROM b
WHERE instr(t.str||input.n||',', ','||b.n2||',') > instr(t.str||input.n||',', ','||b.n1||',')
AND instr(t.str||input.n||',', ','||b.n3||',') > instr(t.str||input.n||',', ','||n2||',')
AND instr(t.str||input.n||',', ','||b.n1||',') > 0
)
)
SELECT trim(BOTH ',' FROM str) AS No_Avg_Spanned_str
FROM t
WHERE lvl=cnt; |
|