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官方文档 获取最新函数列表和最佳实践。

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

相关推荐
找不到、了12 分钟前
Spring的Bean原型模式下的使用
java·spring·原型模式
阿华的代码王国30 分钟前
【Android】搭配安卓环境及设备连接
android·java
YuTaoShao41 分钟前
【LeetCode 热题 100】141. 环形链表——快慢指针
java·算法·leetcode·链表
铲子Zzz1 小时前
Java使用接口AES进行加密+微信小程序接收解密
java·开发语言·微信小程序
霖檬ing1 小时前
K8s——配置管理(1)
java·贪心算法·kubernetes
Vic101012 小时前
Java 开发笔记:多线程查询逻辑的抽象与优化
java·服务器·笔记
Biaobiaone2 小时前
Java中的生产消费模型解析
java·开发语言
特立独行的猫a3 小时前
11款常用C++在线编译与运行平台推荐与对比
java·开发语言·c++
louisgeek3 小时前
Java 位运算
java
hweiyu003 小时前
Maven 私库
java·maven