【问题标题】:BigQuery Standard SQL - Cumulative Count of (almost) Duplicated RowsBigQuery 标准 SQL - (几乎)重复行的累积计数
【发布时间】:2021-06-23 02:26:11
【问题描述】:

有以下数据:

id field eventTime
1 A 1
1 A 2
1 B 3
1 A 4
1 B 5
1 B 6
1 B 7

出于可视化目的,我想把它变成下面的样子。相同field 值的连续出现本质上会聚合为一个。

id field eventTime
1 Ax2 1
1 B 3
1 A 4
1 Bx3 5

然后我将使用STRING_AGG() 将其转换为"Ax2 > B > A > Bx3"

我已经尝试使用ROW_NUMBER()来计算重复实例,计划是使用最高行号来修改field中的字符串,但是如果我在eventTime上进行分区,则没有连续的“重复”,如果我不对它进行分区,那么所有具有相同 field 值的行都会被计算在内 - 而不仅仅是连续的。

我虽然将之前的fieldLAG() 引入比较以重置行数,但这仅适用于从一个field 值到另一个值的转换,如果相同的@987654333 是一个问题@ 连续重复。

我一直在努力解决这个问题,以至于我正在考虑编写一个脚本,使 CASE WHENs 达到合理的连续点击次数,但我看到它在给定的情况下高达 17一天,真的不想那样做!

我的另一种选择是强制使用最大数量的 field 值来帮助控制这一点,但现在我已经开始了这个问题,如果可能的话,我很想在没有它的情况下解决它。

谢谢!

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    考虑下面

    select id, 
      any_value(field) || if(count(1) = 1, '', 'x' || count(1)) field, 
      min(eventTime) eventTime 
    from (
      select id, field, eventTime, 
        countif(ifnull(flag, true)) over(partition by id order by eventTime) grp 
      from (
        select id, field, eventTime,
          field != lag(field) over(partition by id order by eventTime) flag
        from `project.dataset.table`
      )
    )
    group by id, grp
    # order by eventTime           
    

    如果应用于您问题中的样本数据 - 输出是

    【讨论】:

      【解决方案2】:

      只需使用lag() 来检测field 的值何时发生变化。您现在可以使用 qualify 来做到这一点:

      select t.*
      from t
      where 1=1
      qualify lag(field, 1, '') over (partition by id order by eventtime) <> field;
      

      对于最后一步,您可以使用子查询:

      select id, string_agg(field, '->' order by eventtime)
      from (select t.*
            from t
            where 1=1
            qualify lag(field, 1, '') over (partition by id order by eventtime) <> field
           ) t
      group by id;
      

      【讨论】:

      • 我不需要忘记该值连续出现的次数。我已经尝试快速实现这一点,但似乎这只是将值压缩到一次而不保持计数,尽管我刚刚了解了资格,所以也许我没有完全正确地使用它。我有一个可行的解决方案,使用 LAG 在字段更改时提供唯一 ID,然后 COALESCE(LAG... 填写这些 ID。然后我可以按这个新 ID 分组来计算。在将其编辑为解决方案之前,我将尝试对其进行清理。
      • @LiamGalbraith。 . .这回答了您在这里提出的问题。如果这不是您要问的问题,请提出一个新的问题。
      • 我不同意,表和字符串中所需的结果都显示了修改后的字段值以反映计数,并且标题声明了“计数”。诚然,在回读“基本上聚合为一个”时,通过删除“累积”,标题可能会更清晰,但我仍然相信预期的结果应该有所帮助。同样有了这个确切的答案,BigQuery 会引发错误“分析函数‘滞后’的参数 3 必须是一个常数。找到 Deref。”。无论哪种方式,感谢您的帮助并向我介绍新事物。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-04
      • 2017-03-23
      • 1970-01-01
      • 1970-01-01
      • 2012-09-14
      相关资源
      最近更新 更多