如何使用 BigQuery 在没有每个元素的情况下获取所有总和值?

Posted

技术标签:

【中文标题】如何使用 BigQuery 在没有每个元素的情况下获取所有总和值?【英文标题】:How to get all sums values with out each element using BigQuery? 【发布时间】:2020-08-06 03:28:14 【问题描述】:

我在 BigQuery 中有一个表。我想计算列中所有值的总和,按 id 交替删除每个元素。作为输出,我希望看到删除的 id 和其他值的总和。

WITH t as (SELECT  1 AS id, "LY" as code,  34 AS value
UNION ALL
SELECT  2, "LY",  45
UNION ALL
SELECT  3, "LY", 23
UNION ALL
SELECT  4, "LY", 5
UNION ALL
SELECT  5, "LY", 54
UNION ALL
SELECT  6, "LY", 78)
SELECT lv id, SUM(lag) sum_wo_id
FROM 
(SELECT *, FIRST_VALUE(id) OVER (ORDER BY id DESC) lv, LAG(value) OVER (Order by id) lag from t)
     GROUP BY lv
    


 

在上面的示例中,我可以看到没有id = 6 的值的总和。如何修改此查询以获取没有其他 ID(如 12346, 12356, 12456, 13456, 23456)的总和并查看删除了哪个?

【问题讨论】:

【参考方案1】:

以下是 BigQuery 标准 SQL

假设 id 是不同的 - 你可以简单地在下面使用

#standardSQL
SELECT id AS removed_id, 
  SUM(value) OVER() - value AS sum_wo_id
FROM t    

如果应用于您问题的样本数据 - 输出是

Row removed_id  sum_wo_id    
1   1           205  
2   2           194  
3   3           216  
4   4           234  
5   5           185  
6   6           161     

如果 id 不是唯一的 - 您可以首先按 id 分组,如下例所示

#standardSQL
SELECT id AS removed_id, 
  SUM(value) OVER() - value AS sum_wo_id
FROM (
  SELECT id, SUM(value) AS value
  FROM t
  GROUP BY id
)

【讨论】:

以上是关于如何使用 BigQuery 在没有每个元素的情况下获取所有总和值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有加入的情况下在 BigQuery 的同一个表中选择匹配项

如何在没有授权令牌的情况下从 python 脚本查询 google-bigquery 中的私有表?

如何在没有交叉产品的情况下从 BigQuery 中的两列中取消嵌套两个列表,作为单独的行

在没有明确定义的结构的情况下插入 BigQuery

如何关联多个 BigQuery 数组字段?

如何在没有 html 元素的情况下使用 ng-repeat