Lakehouse 数据分组聚合指南

概述

数据分组聚合是数据分析的核心操作,用于将数据按维度分组并计算统计指标。云器 Lakehouse 提供完整的聚合函数支持,包括基础聚合、条件聚合、近似聚合等。本指南按业务场景分类,帮助你快速掌握高效的数据聚合方法。

涉及的 SQL 命令

命令/函数用途适用场景
GROUP BY
GROUP BY
按列分组维度聚合分析
COUNT(*)
COUNT(*)
/
COUNT(col)
COUNT(col)
计数统计行数或非空值数量
SUM()
SUM()
/
AVG()
AVG()
/
MIN()
MIN()
/
MAX()
MAX()
数值聚合求和、平均、最值
HAVING
HAVING
过滤分组结果替代 WHERE 过滤聚合后数据
COUNT(DISTINCT col)
COUNT(DISTINCT col)
去重计数统计唯一值数量
APPROX_COUNT_DISTINCT()
APPROX_COUNT_DISTINCT()
近似去重计数大数据量快速估算

前置准备

以下示例使用模拟的销售表

sales
sales

-- 创建测试表 CREATE TABLE IF NOT EXISTS sales ( sale_id INT, region STRING, product STRING, amount DOUBLE, quantity INT, sale_date DATE ); -- 插入测试数据 INSERT INTO sales VALUES (1, 'East', 'Phone', 5000, 10, '2024-06-01'), (2, 'East', 'Laptop', 8000, 5, '2024-06-01'), (3, 'West', 'Phone', 4500, 9, '2024-06-02'), (4, 'West', 'Tablet', 3000, 8, '2024-06-02'), (5, 'East', 'Phone', 5000, 10, '2024-06-03'), (6, 'South', 'Laptop', 8000, 5, '2024-06-03'), (7, 'South', 'Tablet', 3000, 8, '2024-06-04');


基础分组聚合

按维度分组并计算聚合指标,是最常见的数据分析操作。

-- 按区域统计销售额和订单数 SELECT region, COUNT(*) as order_count, SUM(amount) as total_sales, AVG(amount) as avg_sales FROM sales GROUP BY region ORDER BY total_sales DESC;

结果说明

regionorder_counttotal_salesavg_sales
East3180006000
West275003750
South2110005500

过滤聚合结果

使用

HAVING
HAVING
子句过滤分组后的结果,替代无法在
WHERE
WHERE
中使用的聚合条件。

-- 查询总销售额大于 10000 的区域 SELECT region, SUM(amount) as total_sales FROM sales GROUP BY region HAVING SUM(amount) > 10000 ORDER BY total_sales DESC;

结果说明

regiontotal_sales
East18000
South11000

WHERE 与 HAVING 的区别

  • WHERE
    WHERE
    在分组前过滤行,不能使用聚合函数。
  • HAVING
    HAVING
    在分组后过滤组,可以使用聚合函数。

-- 正确:先过滤日期,再分组 SELECT region, SUM(amount) as total_sales FROM sales WHERE sale_date >= '2024-06-02' GROUP BY region HAVING SUM(amount) > 5000;


条件聚合

使用

CASE WHEN
CASE WHEN
配合聚合函数,实现条件统计,避免多次扫描表。

-- 按区域统计各类产品的销售额 SELECT region, SUM(CASE WHEN product = 'Phone' THEN amount ELSE 0 END) as phone_sales, SUM(CASE WHEN product = 'Laptop' THEN amount ELSE 0 END) as laptop_sales, SUM(CASE WHEN product = 'Tablet' THEN amount ELSE 0 END) as tablet_sales, SUM(amount) as total_sales FROM sales GROUP BY region ORDER BY region;

结果说明

regionphone_saleslaptop_salestablet_salestotal_sales
East100008000018000
South08000300011000
West4500030007500

去重计数

统计唯一值数量时,使用

COUNT(DISTINCT col)
COUNT(DISTINCT col)

-- 统计各区域销售的产品种类数 SELECT region, COUNT(DISTINCT product) as unique_products, SUM(quantity) as total_quantity FROM sales GROUP BY region ORDER BY unique_products DESC;

结果说明

regionunique_productstotal_quantity
East225
South213
West217

近似聚合

当数据量极大时,精确去重计数可能较慢。Lakehouse 提供近似聚合函数,在可接受的误差范围内大幅提升性能。

-- 使用近似去重计数(适合千万级以上数据) SELECT region, APPROX_COUNT_DISTINCT(product) as approx_unique_products, COUNT(DISTINCT product) as exact_unique_products FROM sales GROUP BY region;

结果说明

regionapprox_unique_productsexact_unique_products
East22
South22
West22

清理测试数据

完成聚合验证后,建议清理测试表:

-- 删除测试表 DROP TABLE IF EXISTS sales;


注意事项

  1. GROUP BY 位置
    GROUP BY
    GROUP BY
    中可以使用列位置(如
    GROUP BY 1
    GROUP BY 1
    ),但建议使用列名以提高可读性。
  2. NULL 值处理
    COUNT(col)
    COUNT(col)
    不统计 NULL 值,
    COUNT(*)
    COUNT(*)
    统计所有行。
    GROUP BY
    GROUP BY
    会将 NULL 值分为一组。
  3. 性能优化:先使用
    WHERE
    WHERE
    过滤再
    GROUP BY
    GROUP BY
    ,可显著减少聚合计算量。
  4. 近似函数适用场景:数据量超过百万行且对精度要求不高时,优先使用
    APPROX_*
    APPROX_*
    系列函数。

相关文档

联系我们
预约咨询
微信咨询
电话咨询