我正在运行一个查询,该查询将整个会话中执行的操作串联到一个字符串中,从而将每次点击降到(Pageview或Event)/(事件的页面或类型)
然后将它们放入长的大字符串中
Pageview / a >>> Pageview / b
问题是,目前我正在处理很多字符串
Pageview /a >>> Pageview /a >>> Pageview /a >>> Event / b >>> Pageview /a >>> Pageview /a
这是网站上的预期行为,而不是我想要的输出。
我要执行的操作是删除连续的重复项,但如果在会话中的两个不同点发生相同的浏览量,则不删除。因此,在上面的示例中,它将变为:
Pageview /a >>> Event / b >>> Pageview /a
对于某些其他情况,我无法控制原始输入的形状,但是可以调整数据的连接方式。因此,如果这样比较简单,我可以在连接发生之前进行删除
答案 0 :(得分:0)
事实上,您可以通过执行以下操作从字符串中删除相邻的重复项:
在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
正如我在评论中提到的那样,您可能应该在原始查询中执行此操作。如果您需要帮助,请提出一个新问题(此问题已得到解答)。
此外,您可能应该习惯于处理数组。它们通常比字符串更强大。
答案 1 :(得分:0)
下面的示例适用于BigQuery Standard SQL,不仅折叠重复的项目,还计数并在输出中显示相应的计数
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 id, 'Pageview /a >>> Pageview /a >>> Pageview /a >>> Event / b >>> Pageview /a >>> Pageview /a' AS actions UNION ALL
SELECT 2, 'Pageview /1 >>> Pageview /1 >>> Pageview /2 >>> Event / 3 >>> Pageview /1 >>> Pageview /1'
)
SELECT id,
(SELECT STRING_AGG(line, ' >>> ' ORDER BY grp) FROM (
SELECT CONCAT(action, ' (', CAST(COUNT(1) AS STRING), ')') line, grp FROM (
SELECT action, COUNTIF(flag) OVER(ORDER BY OFFSET) grp
FROM (
SELECT action, OFFSET, action != LAG(action) OVER(ORDER BY OFFSET) flag
FROM UNNEST(SPLIT(actions, ' >>> ')) action WITH OFFSET
))
GROUP BY action, grp
)) compressed_actions
FROM `project.dataset.table`
有输出
Row id compressed_actions
1 1 Pageview /a (3) >>> Event / b (1) >>> Pageview /a (2)
2 2 Pageview /1 (2) >>> Pageview /2 (1) >>> Event / 3 (1) >>> Pageview /1 (2)