Clickhouse常用函数

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;

五、注意事项

  1. 性能优化 :使用 uniqExact 替代 count(DISTINCT) 时需注意内存消耗。
  2. 版本兼容性 :部分函数(如 quantile 的精确度参数)可能因版本不同而有所差异。
  3. 自定义计算:复杂指标(如峰度、偏度)需手动实现,建议封装为视图或物化视图。

六、总结

ClickHouse 的统计函数和类型转换功能强大,能够高效处理大规模数据的分析需求。质量控制指标虽需结合业务逻辑自行计算,但通过组合内置函数可快速实现。建议结合实际场景,参考 ClickHouse官方文档 获取最新函数列表和最佳实践。

通过合理使用这些函数,开发者可以快速构建实时分析系统,满足从基础统计到复杂质量控制的多样化需求。

相关推荐
Java技术小馆40 分钟前
如何处理消息堆积
java·面试·架构
zzzzz3691 小时前
SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”的解决方案
java·后端
灰色人生qwer1 小时前
lombok的坑
java·idea·lombok
异常君1 小时前
揭秘 Java 线程安全:从问题根源到实用解决方案
java·后端
雷渊1 小时前
如果消费者A订阅了下单消息,会消费之前的下单消息吗?还是从订阅后开始消费?
java·后端·面试
By北阳1 小时前
Java函数式编程魔法:Stream API的10种妙用
java·windows·python
异常君1 小时前
Java 多线程揭秘:彻底掌握线程状态转换与控制方法
java·后端
小智疯狂敲代码1 小时前
Spring AOP源码-动态代理与切面编程
java·面试
异常君1 小时前
打造你的 Java 工具箱:自定义注解处理实战手册
java·后端
不会写代码的女程序猿1 小时前
java版本招投标管理系统功能详解与应用场景
java·企业招投标系统源码·招投标系统