sql - 从连接的字符串中删除顺序重复
问题描述
我正在运行一个查询,它将整个会话中采取的操作连接到一个字符串中,将每次点击减少到(页面浏览或事件)/(页面或事件类型)
然后它将它们放入一个大长字符串中
Pageview / a >>> Pageview / b
问题是目前我得到了很多字符串
Pageview /a >>> Pageview /a >>> Pageview /a >>> Event / b >>> Pageview /a >>> Pageview /a
这是网站上的预期行为,而不是我正在寻找的输出。
我要做的是删除顺序重复,但如果会话中的两个不同点发生相同的网页浏览,则不删除。因此,在上面的示例中,它将变为:
Pageview /a >>> Event / b >>> Pageview /a
对于一些额外的上下文,我无法控制原始输入的形状,但我可以调整数据的连接方式。因此,如果这更直接,我可以在连接发生之前进行此删除
解决方案
事后,您可以通过执行以下操作从字符串中删除相邻的重复项:
- 将字符串拆分为数组
- 将数组展开为表格
- 寻找不同的相邻值
- 重新聚合为字符串
在 BigQuery 中,这是:
select (select string_agg(s.s, ' >>> ')
from (select s, lag(s) over (order by n) as prev_s
from unnest(split(str, ' >>> ')) s with offset n
) s
where s.prev_s is null or s.prev_s <> s.s
)
from (select 'Pageview /a >>> Pageview /a >>> Pageview /a >>> Event / b >>> Pageview /a >>> Pageview /a' as str
) x
正如我在评论中提到的,您可能应该在原始查询中执行此操作。如果您需要这方面的帮助,请提出一个新问题(此问题已得到解答)。
此外,您可能应该习惯于使用数组。它们通常比字符串更强大。