我有以下三列 -
Dated status count
01-02-13 1A + 2B + 73PLO 76
01-02-13 29A + 17ACB 46
01-02-13 9PLO + 11B + 5TY 25
02-02-13 18FGH + 23B + 4ACB 45
02-02-13 8ACB + 12A + 2FGH 22
02-02-13 6A + 2B + 42ACB 50
03-02-13 ..... ...
............
因此,我的最终结果应该为特定的“日期”添加三个字符串(“状态”),但请记住特定日期的三个字符串的公共(public)子字符串,如下 -
dated status count
01-02-13 30A + 13B + 82PLO + 17ACB + 5TY 147
02-02-13 20FGH + 25B + 73PLO + 54ACB + 18A 117
03-02-13 ......(and similarly) ....
在这里,我实际上通过添加计数并合并“状态”来创建一个“日期”表达式组,但实际上我无法达到这个...... 需要一些帮助。
最佳答案
没有经过彻底的测试,但我认为这是你所需要的,我没有考虑所有的测试用例,可能在某些情况下总计数有所不同,但状态分组是正确的。
SELECT dated
,LISTAGG(num||val, ' + ') WITHIN GROUP (ORDER BY val) status
,MAX(cnt) "count"
FROM
--middle section start
(
SELECT dated
,SUM(regexp_substr(sub_status,'[0-9]+')) num
,regexp_substr(sub_status,'[A-Z]+')val,MAX(cnt) cnt
FROM
--inner section start
(
SELECT DISTINCT dated
,TRIM(REGEXP_SUBSTR( status, '[^+]+', 1, LEVEL)) sub_status
,SUM(DISTINCT "count") OVER(PARTITION BY dated) cnt
FROM DATA
CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(status, '[^+]+')) + 1
)
--inner section end
GROUP BY dated
,regexp_substr(sub_status,'[A-Z]+')
)
--middle section end
GROUP BY dated;
- 内部部分:首先我尝试分隔由
+
分隔的行中的所有不同值 - 然后我进一步分离该值,删除数字部分和字母部分。
- 中间部分:我尝试根据日期列和字母部分的分组来计算数字部分的总和。
- 外部部分:我根据日期列合并中间部分的结果,用
+
分隔
*注意*我还没有测试过这个,但这应该是解决这个问题的方法,不考虑同一组中具有相同值的计数
关于java - oracle中三串列的公共(public)子串合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20440638/