sql - bigquery按除几列外的所有列分组

标签 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)

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

最佳答案

以下是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

关于sql - bigquery按除几列外的所有列分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54792360/

相关文章:

group-by - 对至少有一列具有真实值的行进行分组

sql - SQL 中最接近的部分字符串匹配

mysql - MySQL 触发器未正确计算总和

mysql - 连接表上的多个 WHERE 子句

mysql - 我可以不在查询中而只在 group by() 中使用 case 语句吗?

pandas 从多列分组中获得 1 排名

node.js - Node BigQuery apiResponse 始终未定义

python - 全局名称 'bigquery' 未定义

sql - 两个表上的并集,其中一个带有 where 子句

mysql - 对 MYSQL 查询中的记录进行分组 - 不显示每个结果