ClickHouse常用统计、质量控制及类型转换函数详解
ClickHouse 是一个高性能的列式数据库管理系统,广泛应用于大数据分析场景。本文将详细介绍其常用的统计函数、质量控制指标函数以及类型转换函数,涵盖总数、平均值、标准差、分位数、中位数、众数、峰度、偏度、CPK、CA、CP等指标的实现方法。
一、统计函数
1. 总数(Count)
用于计算行数或满足条件的记录数。
sql
SELECT count(*) AS total FROM table_name; -- 总行数
SELECT count(column) AS non_null_count FROM table_name; -- 非空值的数量
2. 平均值(Average)
计算数值列的平均值。
sql
SELECT avg(value) AS average_value FROM measurements;
3. 标准差(Standard Deviation)
计算样本标准差(stddevSamp
)或总体标准差(stddevPop
)。
sql
SELECT
stddevSamp(value) AS sample_stddev,
stddevPop(value) AS population_stddev
FROM data_table;
4. 分位数(Quantile)
计算指定分位数,例如中位数(0.5分位数)。
sql
SELECT
quantile(0.5)(value) AS median, -- 中位数
quantile(0.9)(value) AS percentile_90 -- 第90百分位数
FROM sales_data;
5. 众数(Mode)
通过 topK
函数获取出现频率最高的值:
sql
SELECT arrayElement(topK(1)(value), 1) AS mode FROM data_table;
6. 总和(Sum)
计算数值列的总和。
sql
SELECT sum(revenue) AS total_revenue FROM sales;
7. 峰度(Kurtosis)与偏度(Skewness)
需通过数学公式手动计算:
sql
SELECT
avg(value) AS mean,
pow(avg(pow(value - mean, 3)), 1/3) / pow(stddevSamp(value), 1) AS skewness,
(avg(pow(value - mean, 4)) / pow(stddevSamp(value), 4)) - 3 AS kurtosis
FROM data_table;
二、质量控制指标函数
1. 过程能力指数(CP)
衡量过程能力与规格范围的匹配程度:
sql
-- 假设 USL(上规格限)和 LSL(下规格限)已知
SELECT
(USL - LSL) / (6 * stddevSamp(value)) AS CP
FROM measurements;
2. 过程性能指数(CPK)
评估过程中心位置与规格限的匹配程度:
sql
SELECT
MIN(
(USL - avg_value) / (3 * std_dev),
(avg_value - LSL) / (3 * std_dev)
) AS CPK
FROM (
SELECT
avg(value) AS avg_value,
stddevSamp(value) AS std_dev
FROM measurements
);
3. 过程能力分析(CA)
综合 CP 和 CPK 的分析,需结合具体业务场景定义公式。
三、类型转换函数
1. 数值类型转换
sql
SELECT
toInt32('123') AS int_value, -- 字符串转整数
toFloat64('3.14') AS float_value, -- 字符串转浮点数
toString(42) AS string_value -- 整数转字符串
2. 日期与时间转换
sql
SELECT
toDate('2023-01-15') AS date_value, -- 字符串转日期
toDateTime('2023-01-15 14:30:00') AS datetime_value, -- 字符串转DateTime
formatDateTime(now(), '%Y-%m-%d %H:%M:%S') AS formatted_time -- 格式化当前时间
3. 数组操作
sql
SELECT
arrayJoin([1, 2, 3]) AS element, -- 展开数组为多行
arraySum([10, 20, 30]) AS total -- 数组元素求和
4. 条件转换
sql
SELECT
ifNull(value, 0) AS safe_value, -- 将NULL转为0
coalesce(NULL, 'default') AS coalesced_value -- 返回第一个非NULL值
四、示例场景:电商数据分析
表结构
sql
CREATE TABLE sales (
entity_id UInt32,
datetime DateTime,
type Enum8('click' = 1, 'view' = 2),
value Float64
) ENGINE = MergeTree()
ORDER BY datetime;
示例查询
sql
-- 计算不同类型的平均值和标准差
SELECT
type,
avg(value) AS average,
stddevSamp(value) AS std_dev,
quantile(0.5)(value) AS median
FROM sales
GROUP BY type;
-- 计算CPK(假设 USL=100, LSL=50)
WITH
(SELECT avg(value) FROM sales WHERE type = 'click') AS mean,
(SELECT stddevSamp(value) FROM sales WHERE type = 'click') AS std_dev
SELECT
MIN(
(100 - mean) / (3 * std_dev),
(mean - 50) / (3 * std_dev)
) AS CPK;
五、注意事项
- 性能优化 :使用
uniqExact
替代count(DISTINCT)
时需注意内存消耗。 - 版本兼容性 :部分函数(如
quantile
的精确度参数)可能因版本不同而有所差异。 - 自定义计算:复杂指标(如峰度、偏度)需手动实现,建议封装为视图或物化视图。
六、总结
ClickHouse 的统计函数和类型转换功能强大,能够高效处理大规模数据的分析需求。质量控制指标虽需结合业务逻辑自行计算,但通过组合内置函数可快速实现。建议结合实际场景,参考 ClickHouse官方文档 获取最新函数列表和最佳实践。
通过合理使用这些函数,开发者可以快速构建实时分析系统,满足从基础统计到复杂质量控制的多样化需求。