聚合函数
聚合函数是SQL的重要功能,其通常配合分组查询使用,sqala内置了ISO/IEC 9075中定义的绝大多数标准聚合函数,不在此标准函数列表中的,您可以使用sqala提供的自定义表达式功能自行创建。
聚合函数使用示例:
scala
val q =
from(Post).map(p => sum(p.likeCount))sqala内置的聚合函数有:
| 函数 | 对应的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会在此情况进行语义检测,因此以下用法会返回编译错误:
scala
val q =
// 编译错误
from(Post).map(p => count(sum(p.likeCount)))此外,sqala支持标准sql的聚合函数LISTAGG,用于聚合字符串,sqala在提供listAgg方法外,也提供了同义词stringAgg和groupConcat。
listAgg函数的第一个参数为需要聚合的表达式,第二个参数为分隔符,第三个参数为排序规则:
scala
val q =
from(Post).map(p => listAgg(p.title, ",", p.id.asc))此函数在各主流数据库中生成的SQL为:
| 数据库类型 | LISTAGG 兼容 |
|---|---|
| PostgreSQL | STRING_AGG(x, ',' ORDER BY y) |
| MySQL | GROUP_CONCAT(x ORDER BY y SEPARATOR ',') |
| Oracle | LISTAGG(x, ',') WITHIN GROUP (ORDER BY y) |
| SQLServer | STRING_AGG(x, ',') WITHIN GROUP (ORDER BY y) |
| SQLite | GROUP_CONCAT(x, ',' ORDER BY y) |
另外,SQL标准中还有两个特殊聚合函数PERCENTILE_CONT和PERCENTILE_DISC,用于计算百分比。
percentileCont/percentileDisc函数的参数为百分比,范围是0 - 1,第二个参数为需要聚合表达式的排序规则。
scala
val q =
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"