【问题标题】:bigquery group by all columns except a fewbigquery 按除少数之外的所有列分组
【发布时间】:2019-02-20 17:42:28
【问题描述】:

我有一个包含大量字段的表,我试图按除我要求和的两个值之外的所有值进行分组。我想做类似的事情

SELECT my_table.* except(value_1, value_2)
    , sum(value_1)
    , sum(value_2)
FROM my_table
GROUP BY my_table.* except(value_1, value_2)

但不幸的是GROUP BY my_table.* except(value_1, value_2) 不起作用。请问有什么建议吗?

【问题讨论】:

    标签: sql group-by google-bigquery


    【解决方案1】:

    以下是 BigQuery 标准 SQL

    #standardSQL
    SELECT DISTINCT * EXCEPT(value_1, value_2, grp),
      SUM(value_1) OVER(PARTITION BY grp) sum_value_1,
      SUM(value_2) OVER(PARTITION BY grp) sum_value_2
    FROM (
      SELECT *, REGEXP_REPLACE(TO_JSON_STRING(t), r'"(?:value_1|value_2)":.+?[,}]', '') grp
      FROM `project.dataset.table` t
    )
    

    你可以像下面的例子一样使用虚拟数据测试,玩上面的例子

    #standardSQL
    WITH `project.dataset.table` AS (
      SELECT 1 value_1, 2 value_2, 3 value_3, 4 value_4 UNION ALL
      SELECT 11, 12, 3, 14 UNION ALL
      SELECT 21, 22, 3, 14
    )
    SELECT DISTINCT * EXCEPT(value_1, value_2, grp),
      SUM(value_1) OVER(PARTITION BY grp) sum_value_1,
      SUM(value_2) OVER(PARTITION BY grp) sum_value_2
    FROM (
      SELECT *, REGEXP_REPLACE(TO_JSON_STRING(t), r'"(?:value_1|value_2)":.+?[,}]', '') grp
      FROM `project.dataset.table` t
    )
    

    结果为

    Row value_3 value_4 sum_value_1 sum_value_2  
    1   3       14      32          34   
    2   3       4       1           2    
    

    以上内容适用于任意数量的列,您无需全部显式引用 - 只有那些要排除的列才能显式引用 - 本示例中为 value_1 和 value_2

    【讨论】:

    • 这太棒了!非常感谢!你能解释一下这部分在做什么吗? REGEXP_REPLACE(TO_JSON_STRING(t), r'"(?:value_1|value_2)":.+?[,}]', '') grp
    • @FiercestJim - 它将整行转换为 json,然后清空 value_1 和 value_2 属性的所有值,以便您可以将其用作 PARTITION BY 的属性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 2017-04-22
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多