支持聚合函数STDDEV

背景

OpenMLDB 尚未支持内置的标准差聚合函数 STDDEV,在这个任务中,你将参照我们的内置聚合函数开发流程,实现一个 STDDEV 的聚合函数。
准备知识:

  1. 标准差 STDDEV 定义:https://en.wikipedia.org/wiki/Standard_deviation#Discrete_random_variable
  2. 内置聚合函数的开发流程https://openmldb.ai/docs/zh/main/developer/built_in_function_develop_guide.html

    编程语言

    C++

    实现方案

    语法定义
    STDDEV(<expr>)
    举例:
    SELECT STDDEV(col1) OVER w1 FROM t1 WINDOW w1 AS (PARTITION BY col0 ORDER BY col2 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW);

整体流程
整体流程与其他聚合函数(例如DISTINCT_COUNT)相似,参数和其他数据库实现保持一致,即 stddev(),详细可以参考:https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html#function_stddev

  1. 实现 StdDev 类,定义 Init, Update, Output 函数
  2. 通过 RegisterUdaf 注册 stddev 函数
  3. 补充 UT 对新增的 STDDEV 聚合函数进行测试
    注意事项
    STDDEV 和其他聚合函数主要不同的地方在于 STDDEV 需要对窗口数据读两次,即第一次读取用来计算平均数;第二次读取用来计算标准差。
    但是对于自定义聚合函数接口,我们只能通过 Update 接口读到当前值,所以我们只能读到一遍数据。为了可以读第二次数据,我们可以通过数组来存储读到的所有数据,在 Output 函数里进行第二遍数据的读取,计算标准差。

    GitHub Issue

    https://github.com/4paradigm/OpenMLDB/issues/2019