我在oracle12c中有一个数据集,它显示了用户通过网站点击的路径。路径是一个带分隔符的字符串,但我需要将各个步骤拆分为多行,其中from和to步骤显示为跨多行的两个独立列,这些行按原始路径、user和date键分组。
使用以下示例数据集:
SELECT 'USER_A', '2020-08-07', '|A|B|C' FROM DUAL
UNION
SELECT 'USER_B', '2020-08-07', '|G|H|I|J|K' FROM DUAL
UNION
SELECT 'USER_B', '2020-08-06', '|A|B|C' FROM DUAL
输入数据如下所示:
User Date WebPath
USER_A 2020-08-07 |A|B|C
USER_B 2020-08-06 |A|B|C
USER_B 2020-08-07 |G|H|I|J|K
所以在2020-08-07,用户a从a点到b点,然后从b点到c点。
我需要输出看起来像下面的输出
USER DATE STARTPOINT ENDPOINT WEBPATH
USER_A 2020-08-07 A B |A|B|C
USER_A 2020-08-07 B C |A|B|C
USER_B 2020-08-06 A B |A|B|C
USER_B 2020-08-06 B C |A|B|C
USER_B 2020-08-07 G H |G|H|I|J|K
USER_B 2020-08-07 H I |G|H|I|J|K
USER_B 2020-08-07 I J |G|H|I|J|K
USER_B 2020-08-07 J K |G|H|I|J|K
3条答案
按热度按时间d7v8vwbk1#
您可以与递归子查询+regexp\u count+regexp\u substr一起使用:
完整示例:
结果:
xvw2m8pv2#
可以使用普通递归子查询分解:
用你的数据可以得到:
db<>小提琴
42fyovps3#
我的甲骨文技能有些生疏,但有一个想法可能有点太老套了:
duplicator
返回数字point_idx = 1, 2, ..., max_path_size
哪里max_path_size
从计数中找到|
中的字符webpath
.在主查询中,您使用replicator对输入数据进行笛卡尔积,因此您可以使用不同的
point_idx
值从1到max_path_size
. 用这个来获取电流(point_idx
a)子串webpath
下一个呢(point_idx+ 1
th)要打印的子字符串。