Skip to content

聚合函数

聚合函数是SQL的重要功能,其通常配合分组查询使用,sqala内置了ISO/IEC 9075中定义的绝大多数标准聚合函数,不在此标准函数列表中的,您可以使用sqala提供的自定义表达式功能自行创建。

聚合函数使用示例:

scala
val q = query:
    from(Post).map(p => sum(p.likeCount))
函数对应的SQL函数
count()COUNT(*)
count(a)COUNT(a)
countDistinct(a)COUNT(DISTINCT a)
sum(a)SUM(a)
avg(a)AVG(a)
max(a)MAX(a)
min(a)MIN(a)
anyValue(a)ANY_VALUE(a)
stddevPop(a)STDDEV_POP(a)
stddevSamp(a)STDDEV_SAMP(a)
varPop(a)VAR_POP(a)
varSamp(a)VAR_SAMP(a)
covarPop(a, b)COVAR_POP(a, b)
covarSamp(a, b)COVAR_SAMP(a, b)
corr(a, b)CORR(a, b)
regrSlop(a, b)REGR_SLOPE(a, b)
regrIntercept(a, b)REGR_INTERCEPT(a, b)
regrCount(a, b)REGR_COUNT(a, b)
regrR2(a, b)REGR_R2(a, b)
regrAvgx(a, b)REGR_AVGX(a, b)
regrAvgy(a, b)REGR_AVGY(a, b)
regrSxx(a, b)REGR_SXX(a, b)
regrSyy(a, b)REGR_SYY(a, b)
regrSxy(a, b)REGR_SXY(a, b)

此外,sqala支持标准sql的聚合函数LISTAGG,用于聚合字符串,但PostgreSQL和MySQL不支持此函数,因此,sqala在PostgreSQL中翻译为STRING_AGG,在MySQL中翻译为GROUP_CONCAT,sqala在提供listAgg方法外,也提供了同义词stringAgggroupConcat

listAgg函数的第一个参数为需要聚合的表达式,第二个参数为分隔符,第三个参数为排序规则:

scala
val q = query:
    from(Post).map(p => listAgg(p.title, ",", p.id.asc))

生成的SQL为:

sql
SELECT
    LISTAGG("t1"."title", ',') WITHIN GROUP (ORDER BY "t1"."id" ASC) AS "c1"
FROM
    "post" "t1"
sql
SELECT
    STRING_AGG("t1"."title", ',' ORDER BY "t1"."id" ASC) AS "c1"
FROM
    "post" AS "t1"
sql
SELECT
    GROUP_CONCAT(`t1`.`title` ORDER BY `t1`.`id` ASC SEPARATOR ',') AS `c1`
FROM
    `post` AS `t1`

另外,SQL标准中还有两个特殊聚合函数PERCENTILE_CONTPERCENTILE_DISC,用于计算百分位。

percentileCont/percentileDisc函数的参数为百分比,范围是0 - 1,第二个参数为需要聚合表达式的排序规则。

scala
val q = query:
    from(Post).map(p => percentileCont(0.5, p.id.asc))

生成的SQL为:

sql
SELECT
    PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY "t1"."id" ASC) AS "c1"
FROM
    "post" AS "t1"