【问题标题】:Simple Distinct Count across Bigquery arrays without using HLL or UDFs不使用 HLL 或 UDF 跨 Bigquery 数组的简单不同计数
【发布时间】:2019-05-08 06:32:56
【问题描述】:

与此处的示例一样,我想在 BigQuery 数组中区分计数:Distinct Count across Bigquery arrays

但是,我有一些额外的要求,使该帖子中提供的解决方案对我来说是可行的:

  • 解决方案必须使用 UDF(太慢
  • 解决方案必须使用 HLL 函数(必须准确)
  • 解决方案必须使用linked 解决方案上显示的SELECT from SELECT 模式,因为它需要聚合最终用户使用的灵活维度组BI 工具

所以,虽然这个扩展示例(包含用户作为分组维度)使用 HLL:

#standardSQL
WITH
  test AS (
  SELECT
    'A' AS User, DATE('2018-01-01') AS ReportDate, 2 AS value, [1,2,3] AS key
  UNION ALL
  SELECT
    'A' AS User, DATE('2018-01-02') AS ReportDate, 3 AS value, [1,4,5] AS key
  UNION ALL
  SELECT
    'B' AS User, DATE('2018-01-02') AS ReportDate, 4 AS value, [4,5,6,7,8] AS key
  UNION ALL
  SELECT
    'B' AS User, DATE('2018-01-02') AS ReportDate, 5 AS value, [3,4,5,6,7] AS key )
SELECT
  User,
  SUM(value) total_value,
  HLL_COUNT.MERGE((
    SELECT
      HLL_COUNT.INIT(key)
    FROM
      UNNEST(key) key)) AS unique_key_count
FROM
  test
GROUP BY
  user

我需要一个能够满足上述要求的不同聚合数组计数的版本。

再次,这意味着如果我仅在 ReportDateUser / ReportDate 的组合或此示例扩展了其他维度的场景上进行分组,它也应该可以正常工作.

【问题讨论】:

    标签: arrays google-bigquery distinct-values


    【解决方案1】:
    #standardSQL
    WITH test AS
    (
      SELECT 'A' AS User, DATE('2018-01-01') AS ReportDate, 2 AS value, [1,2,3] AS key UNION ALL
      SELECT 'A' AS User, DATE('2018-01-02') AS ReportDate, 3 AS value, [1,4,5] AS key UNION ALL
      SELECT 'B' AS User, DATE('2018-01-02') AS ReportDate, 4 AS value, [4,5,6,7,8] AS key UNION ALL
      SELECT 'B' AS User, DATE('2018-01-02') AS ReportDate, 5 AS value, [3,4,5,6,7] AS key  
    )
    SELECT 
      User,
      SUM(IF(flag=0, value, 0)) total_value,
      COUNT(DISTINCT key) unique_key_count
    FROM test, UNNEST(key) key WITH OFFSET flag
    GROUP BY User   
    

    结果

    Row User    total_value unique_key_count     
    1   A       5           5    
    2   B       9           6    
    

    【讨论】:

    • 哇,这看起来是一个巧妙的解决方案,我将在下周的 Looker(BI 工具)中尝试一下......
    • 但是:还有没有取消嵌套数组的版本吗?
    • 顺势而为 - 恐怕您的下​​一个问题会是“我们可以在没有 SELECT 的情况下做到这一点吗?”我不得不说 Never say Never。好的 - 严肃地说:我不认为在你的情况下你可以避免使用取消嵌套 - 因为不同的计数。如果您只计算总条目 - 您可以只使用数组长度,但不能在您寻找不同时使用。但是..正如我提到的 - 永远不要说永远 - 有人可能会提出另一个巧妙的解决方案:o)。同时考虑投票,如果还没有,请在您尝试后告诉我们结果
    • 嗨,谢谢。我想说的是,如果 Google 确实将 DISTINCT 选项添加到 ARRAY_CONCAT_AGG,这应该可以通过一种非常简单的方式实现。为此创建了新功能请求:issuetracker.google.com/issues/120759351
    猜你喜欢
    • 2019-02-28
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 2017-12-15
    相关资源
    最近更新 更多