在 bigquery 中的某个阈值处启动 SUM 聚合

点赞

设备的能源使用量每小时记录一次:

+--------------+-----------+-----------------------+
| energy_usage | device_id |  timestamp            |
+--------------+-----------+-----------------------+
| 10           | 1         |  2019-02-12T01:00:00  |
| 16           | 2         |  2019-02-12T01:00:00  |
| 26           | 1         |  2019-03-12T02:00:00  |
| 24           | 2         |  2019-03-12T02:00:00  |
+--------------+-----------+-----------------------+

我的目标是:

  1. 创建两列,一列energy_usage_day用于energy_usage_night(8am-8pm) ,另一列用于(8pm-8am)
  2. 创建每月汇总,按 device_id 分组并汇总能源使用情况

所以结果可能是这样的:

+--------------+------------------+--------------------+-----------+---------+------+
| energy_usage | energy_usage_day | energy_usage_night | device_id |  month  | year |
+--------------+------------------+--------------------+-----------+---------+------+
| 80           | 30               | 50                 | 1         | 2       | 2019 |
| 130          | 60               | 70                 | 2         | 3       | 2019 |
+--------------+------------------+--------------------+-----------+---------+------+

以下查询产生这样的结果:

SELECT SUM(energy_usage) energy_usage
  , SUM(IF(EXTRACT(HOUR FROM timestamp) BETWEEN 8 AND 19, energy_usage, 0)) energy_usage_day
  , SUM(IF(EXTRACT(HOUR FROM timestamp) NOT BETWEEN 8 AND 19, energy_usage, 0)) energy_usage_night
  , device_id
  , EXTRACT(MONTH FROM timestamp) month, EXTRACT(YEAR FROM timestamp) year
FROM `data`
GROUP BY device_id, month, year

假设我只对高于某个阈值的能源使用总量感兴趣,例如 50。我想以 50 的总能源使用量开始 SUM。结果应该如下所示:

+--------------+------------------+--------------------+-----------+---------+------+
| energy_usage | energy_usage_day | energy_usage_night | device_id |  month  | year |
+--------------+------------------+--------------------+-----------+---------+------+
| 30           | 10               | 20                 | 1         | 2       | 2019 |
| 80           | 50               | 30                 | 2         | 3       | 2019 |
+--------------+------------------+--------------------+-----------+---------+------+

换句话说:只有当energy_usage 达到阈值50 时,查询才应开始汇总energy_usage、energy_usage_day 和energy_usage_night。

这在bigquery中可能吗?

米哈伊尔·贝里安特

以下是 BigQuery Standard SQL 的逻辑,它仅在达到 50 个(每个设备每月)后才开始聚合使用

#standardSQL
WITH temp AS (
  SELECT *, SUM(energy_usage) OVER(win) > 50 qualified,
    EXTRACT(HOUR FROM `timestamp`) BETWEEN 8 AND 20 day_hour,
    EXTRACT(MONTH FROM `timestamp`) month, 
    EXTRACT(YEAR FROM `timestamp`) year    
  FROM `project.dataset.table`
  WINDOW win AS (PARTITION BY device_id, TIMESTAMP_TRUNC(`timestamp`, MONTH) ORDER BY `timestamp`)
)
SELECT SUM(energy_usage) energy_usage,
  SUM(IF(day_hour, energy_usage, 0)) energy_usage_day,
  SUM(IF(NOT day_hour, energy_usage, 0)) energy_usage_night,
  device_id,
  month, 
  year
FROM temp
WHERE qualified
GROUP BY device_id, month, year   

假设当前使用的 SUM 为 49,下一个使用条目的值为 2。SUM 将为 51。因此,使用 2 将添加到 SUM。相反,应该只添加 1 的一半。我们可以在 BigQuery SQL 中解决这样的问题吗?

#standardSQL
WITH temp AS (
  SELECT *, SUM(energy_usage) OVER(win) > 50 qualified,
    SUM(energy_usage) OVER(win) - 50 rolling_sum,
    EXTRACT(HOUR FROM `timestamp`) BETWEEN 8 AND 20 day_hour,
    EXTRACT(MONTH FROM `timestamp`) month, 
    EXTRACT(YEAR FROM `timestamp`) year    
  FROM `project.dataset.table`
  WINDOW win AS (PARTITION BY device_id, TIMESTAMP_TRUNC(`timestamp`, MONTH) ORDER BY `timestamp`)
), temp_with_adjustments AS (
  SELECT *, 
    IF(
      ROW_NUMBER() OVER(PARTITION BY device_id, month, year ORDER BY `timestamp`) = 1, 
      rolling_sum, 
      energy_usage
    ) AS adjusted_energy_usage
  FROM temp 
  WHERE qualified
)
SELECT SUM(adjusted_energy_usage) energy_usage,
  SUM(IF(day_hour, adjusted_energy_usage, 0)) energy_usage_day,
  SUM(IF(NOT day_hour, adjusted_energy_usage, 0)) energy_usage_night,
  device_id,
  month, 
  year
FROM temp_with_adjustments
GROUP BY device_id, month, year  

正如你所看到的,我刚刚添加了逻辑temp_with_adjustments(和 rolling_sumtemp以支持这一点) - 其余的都是一样的

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

BigQuery中的交叉联接后的行聚合

来自分类Dev

dplyr 中的 Sum() 和聚合:NA 值

来自分类Dev

如何替换聚合函数 SUM() 中的 SELECTS

来自分类Dev

如何计算BigQuery中某列的布尔聚合?

来自分类Dev

不允许聚合聚合 Bigquery

来自分类Dev

Scala sum聚合问题

来自分类Dev

在MongoDB中再次聚合+ $ project + $ group + $ sum + $ count + $ group

来自分类Dev

postgresql中的sum()返回单个值而不是聚合值

来自分类Dev

一个文档中的聚合 $group $sum 字段

来自分类Dev

BigQuery中SUM的总和,不包含重复项

来自分类Dev

如何将聚合函数应用于Google BigQuery中从JSON提取的数据?

来自分类Dev

BigQuery 和标准 SQL:聚合数组中的每个 distnict 字段

来自分类Dev

Bigquery SQL用于滑动窗口聚合

来自分类Dev

分组聚合中的限制聚合

来自分类Dev

R与sum(Dataframe $ columns)/ N中的聚合函数有何不同?

来自分类Dev

计算数据框中特定列(SUM,AVG,STDEV)的所有嵌套级别聚合

来自分类Dev

R与sum(Dataframe $ columns)/ N中的聚合函数有何不同?

来自分类Dev

聚合函数 AVG 和 SUM 正在更改我在 SybaseIQ 中的数据类型大小列

来自分类Dev

在聚合查询中组合 $divide 和 $sum 时出现语法错误

来自分类Dev

在计算列上使用GROUP BY聚合SUM

来自分类Dev

使用MAX()和SUM()聚合的SQL查询

来自分类Dev

如何合并聚合函数Sum()和Max()

来自分类Dev

带有SUM(CASE)的SQL聚合函数

来自分类Dev

SUM聚合将每个值取整?

来自分类Dev

非聚合列、SUM、MAX 和 GROUP BY

来自分类Dev

获取空值,$sum 聚合 - Mongo

来自分类Dev

PostgreSQL:子查询和聚合函数(Sum)

来自分类Dev

尝试在 Pandas 中使用聚合 sum 函数

来自分类Dev

无法使用exact_count_distinct BigQuery聚合函数

Related 相关文章

  1. 1

    BigQuery中的交叉联接后的行聚合

  2. 2

    dplyr 中的 Sum() 和聚合:NA 值

  3. 3

    如何替换聚合函数 SUM() 中的 SELECTS

  4. 4

    如何计算BigQuery中某列的布尔聚合?

  5. 5

    不允许聚合聚合 Bigquery

  6. 6

    Scala sum聚合问题

  7. 7

    在MongoDB中再次聚合+ $ project + $ group + $ sum + $ count + $ group

  8. 8

    postgresql中的sum()返回单个值而不是聚合值

  9. 9

    一个文档中的聚合 $group $sum 字段

  10. 10

    BigQuery中SUM的总和,不包含重复项

  11. 11

    如何将聚合函数应用于Google BigQuery中从JSON提取的数据?

  12. 12

    BigQuery 和标准 SQL:聚合数组中的每个 distnict 字段

  13. 13

    Bigquery SQL用于滑动窗口聚合

  14. 14

    分组聚合中的限制聚合

  15. 15

    R与sum(Dataframe $ columns)/ N中的聚合函数有何不同?

  16. 16

    计算数据框中特定列(SUM,AVG,STDEV)的所有嵌套级别聚合

  17. 17

    R与sum(Dataframe $ columns)/ N中的聚合函数有何不同?

  18. 18

    聚合函数 AVG 和 SUM 正在更改我在 SybaseIQ 中的数据类型大小列

  19. 19

    在聚合查询中组合 $divide 和 $sum 时出现语法错误

  20. 20

    在计算列上使用GROUP BY聚合SUM

  21. 21

    使用MAX()和SUM()聚合的SQL查询

  22. 22

    如何合并聚合函数Sum()和Max()

  23. 23

    带有SUM(CASE)的SQL聚合函数

  24. 24

    SUM聚合将每个值取整?

  25. 25

    非聚合列、SUM、MAX 和 GROUP BY

  26. 26

    获取空值,$sum 聚合 - Mongo

  27. 27

    PostgreSQL:子查询和聚合函数(Sum)

  28. 28

    尝试在 Pandas 中使用聚合 sum 函数

  29. 29

    无法使用exact_count_distinct BigQuery聚合函数

热门标签

归档