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

Dar*_*ioB 9 sql group-by google-bigquery

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

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)
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*ant 9

下面是 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
)
Run Code Online (Sandbox Code Playgroud)

您可以使用以下示例中的虚拟数据进行测试,玩上面

#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
)
Run Code Online (Sandbox Code Playgroud)

结果为

Row value_3 value_4 sum_value_1 sum_value_2  
1   3       14      32          34   
2   3       4       1           2    
Run Code Online (Sandbox Code Playgroud)

以上将适用于任意数量的列,您不需要全部明确引用它们 - 只有那些要排除的列才能被明确引用 - 在此示例中为 value_1 和 value_2