bigquery 按除少数之外的所有列分组

Posted

技术标签:

【中文标题】bigquery 按除少数之外的所有列分组【英文标题】:bigquery group by all columns except a few 【发布时间】: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) 不起作用。请问有什么建议吗?

【问题讨论】:

【参考方案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 的属性

以上是关于bigquery 按除少数之外的所有列分组的主要内容,如果未能解决你的问题,请参考以下文章

在 BigQuery 中选择除 ARRAY_AGG + STRUCT 中的一列之外的所有内容

如何从 CIDR BigQuery 获取 From & To IP 地址

根据条件对 BigQuery 中的行进行重复数据删除

上个月的最后一天 - BigQuery

使用 :not(selector) 选择除少数之外的所有元素 [重复]

使 .gitignore 忽略除少数文件之外的所有内容