本文目录导读:

我来详细解释聚合函数的选择方法和常见场景。
聚合函数类型
常用聚合函数
| 函数 | 作用 | 适用场景 |
|---|---|---|
| COUNT() | 计数 | 统计行数、非空值数量 |
| SUM() | 求和 | 数值字段累加 |
| AVG() | 平均值 | 计算数值字段均值 |
| MAX() | 最大值 | 找最大数值或最早日期 |
| MIN() | 最小值 | 找最小数值或最晚日期 |
特殊聚合函数
| 函数 | 作用 | 示例 |
|---|---|---|
| GROUP_CONCAT() | 字符串连接 | MySQL: GROUP_CONCAT(name) |
| STRING_AGG() | 字符串聚合 | PostgreSQL: STRING_AGG(name, ',') |
| STDDEV() | 标准差 | 计算数据离散程度 |
| VARIANCE() | 方差 | 计算数据变异程度 |
| MEDIAN() | 中位数 | PostgreSQL支持 |
| PERCENTILE_CONT() | 百分位数 | 分布分析 |
选择策略
按数据类型选择
数值类型 → SUM, AVG, MAX, MIN, COUNT
日期类型 → MAX, MIN, COUNT
字符串类型 → COUNT, MAX, MIN, GROUP_CONCAT
布尔类型 → COUNT, SUM(转为1/0)
按分析目的选择
统计数量 → COUNT(*)
计算总额 → SUM(amount)
平均价格 → AVG(price)
最高/最低 → MAX/MIN
数据分布 → STDDEV, PERCENTILE
实际案例
场景1:电商订单分析
-- 统计订单情况
SELECT
customer_id,
COUNT(order_id) AS order_count, -- 订单数量
SUM(amount) AS total_spent, -- 总消费
AVG(amount) AS avg_order_value, -- 平均订单金额
MAX(order_date) AS last_order, -- 最近下单日期
MIN(order_date) AS first_order -- 首次下单日期
FROM orders
GROUP BY customer_id;
场景2:销售绩效分析
-- 销售人员绩效
SELECT
salesperson,
COUNT(DISTINCT client_id) AS client_count, -- 客户数
SUM(revenue) AS total_revenue, -- 总收入
AVG(revenue) AS avg_deal_size, -- 平均交易额
MAX(revenue) AS biggest_deal, -- 最大单笔
MIN(revenue) AS smallest_deal -- 最小单笔
FROM sales
WHERE year = 2024
GROUP BY salesperson;
注意事项
NULL值处理
-- COUNT 的不同表现 COUNT(*) -- 包含NULL的行 COUNT(column) -- 不包含NULL值 COUNT(DISTINCT) -- 去重后计数 -- 处理NULL值 AVG(COALESCE(salary, 0)) -- 将NULL转为0 MAX(IFNULL(score, 0)) -- MySQL语法
性能优化
-- 避免重复计算
SELECT
COUNT(*),
SUM(amount),
SUM(amount)/COUNT(*) AS avg -- 而不是再用AVG
FROM table;
-- 使用索引
CREATE INDEX idx_salary ON employees(salary);
SELECT MAX(salary), MIN(salary) FROM employees;
组合使用技巧
-- 多层聚合
SELECT
department,
AVG(salary) as avg_salary,
AVG(salary) - STDDEV(salary) as low_range,
AVG(salary) + STDDEV(salary) as high_range
FROM employees
GROUP BY department;
选择决策树
graph TD
A[需要什么统计?] --> B{数值类型?}
B -->|数字| C{统计目的?}
B -->|日期| D{时间范围?}
B -->|文本| E{需要计数?}
C -->|总量| F[SUM]
C -->|平均| G[AVG]
C -->|极值| H[MAX/MIN]
C -->|分布| I[STDDEV/VARIANCE]
D -->|最早| J[MIN]
D -->|最晚| K[MAX]
E -->|总数| L[COUNT]
E -->|连接| M[GROUP_CONCAT]
最佳实践
- 明确需求:先确定要分析什么指标
- 数据类型:确保函数适用于目标列
- 性能考虑:大数据量时避免HLL类型聚合
- 结果验证:检查聚合结果是否合理
- NULL处理:明确NULL值对结果的影响
选择原则:根据数据类型+分析目的+性能要求三者综合考虑选择合适的聚合函数。