首页 > 解决方案 > 如何确定 BigQuery 中的 GROUPING 值是否为 NULL?

问题描述

BigQuery 支持ROLLUP,例如:

WITH Sales AS (
  SELECT 123 AS sku, 1 AS day, 9.99 AS price UNION ALL
  SELECT 123, 1, 8.99 UNION ALL
  SELECT 456, 1, 4.56 UNION ALL
  SELECT 123, NULL, 9.99 UNION ALL
  SELECT 789, 3, 1.00 UNION ALL
  SELECT 456, 3, 4.25 UNION ALL
  SELECT 789, 3, 0.99
)
SELECT
  sku,
  day,
  SUM(price) AS total
FROM Sales
GROUP BY ROLLUP(sku, day)
ORDER BY sku, day;

我们得到:

在此处输入图像描述

我的问题是是否有办法做GROUPINGGROUPING_ID在 BigQuery 中?是的,我知道解决方法是“在查询之前清理空值”,但假设有很多列,我不知道哪些列有空值,是否有 UDF 或其他方式来完成这个GROUPING()概念在 BQ 聚合中?

标签: sqlgoogle-bigquery

解决方案


您的问题可能没有现成的解决方案,但这是我尝试在一次扫描中进行多个聚合时使用的方法。请注意,当我不关心量化空值或已经估算空值时,我会使用它。

select concat(if(sku is null,'','(sku)'),
              if(day is null,'','(day)'),
              if(coalesce(sku,day) is not null,'','(overall)')) as agg_level,
        sku,
        day,
        sum(price) as total
from sales
group by rollup(sku, day)
order by sku,day;

推荐阅读