从串联字符串中删除顺序重复项

时间:2019-07-17 14:04:35

标签: sql google-bigquery

我正在运行一个查询,该查询将整个会话中执行的操作串联到一个字符串中,从而将每次点击降到(Pageview或Event)/(事件的页面或类型)

然后将它们放入长的大字符串中

Pageview / a >>> Pageview / b

问题是,目前我正在处理很多字符串

Pageview /a >>> Pageview /a >>> Pageview /a >>> Event / b >>> Pageview /a >>> Pageview /a

这是网站上的预期行为,而不是我想要的输出。

我要执行的操作是删除连续的重复项,但如果在会话中的两个不同点发生相同的浏览量,则不删除。因此,在上面的示例中,它将变为:

Pageview /a >>> Event / b >>> Pageview /a

对于某些其他情况,我无法控制原始输入的形状,但是可以调整数据的连接方式。因此,如果这样比较简单,我可以在连接发生之前进行删除

2 个答案:

答案 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)