Skip to main content

PostgreSQL特定的聚合函数

New in Django 1.9.

这些功能在 PostgreSQL文档 中更详细地描述。

注解

所有函数没有缺省别名,因此必须显式提供一个别名。例如:

>>> SomeModel.objects.aggregate(arr=ArrayAgg('somefield'))
{'arr': [0, 1, 2]}

通用聚合函数

ArrayAgg

class ArrayAgg(expression, **extra)

返回值列表,包括连接到数组的null。

BitAnd

class BitAnd(expression, **extra)

返回所有非空输入值的按位 ANDint,如果所有值为空,则返回 None

BitOr

class BitOr(expression, **extra)

返回所有非空输入值的按位 ORint,如果所有值为空,则返回 None

BoolAnd

class BoolAnd(expression, **extra)

返回 True (如果所有输入值为true),None (如果所有值为null或没有值,否则为 False)。

BoolOr

class BoolOr(expression, **extra)

如果至少一个输入值为true,则返回 True;如果所有值为空,或者如果没有值,则返回 None,否则返回 False

StringAgg

class StringAgg(expression, delimiter)

返回连接到字符串中的输入值,由 delimiter 字符串分隔。

delimiter

必需参数。需要是字符串。

统计的聚合函数

yx

所有这些函数的参数 yx 可以是返回数字数据的字段或表达式的名称。两者都是必需的。

Corr

class Corr(y, x)

将相关系数作为 float 返回,或者如果没有任何匹配的行,则返回 None

CovarPop

class CovarPop(y, x, sample=False)

将群体协方差返回为 float,如果没有任何匹配的行,则返回 None

有一个可选参数:

sample

默认情况下,CovarPop 返回一般群体协方差。然而,如果 sample=True,返回值将是样本总体协方差。

RegrAvgX

class RegrAvgX(y, x)

返回作为 float 的独立变量(sum(x)/N)的平均值,如果没有任何匹配的行,则返回 None

RegrAvgY

class RegrAvgY(y, x)

返回因变量(sum(y)/N)作为 float 的平均值,如果没有任何匹配的行,则返回 None

RegrCount

class RegrCount(y, x)

返回两个表达式都不为空的输入行数的 int

RegrIntercept

class RegrIntercept(y, x)

返回由 (x, y) 对作为 float 确定的最小二乘拟合线性方程的y截距,如果没有任何匹配的行,则返回 None

RegrR2

class RegrR2(y, x)

返回相关系数的平方作为 float,或者如果没有任何匹配的行,则返回 None

RegrSlope

class RegrSlope(y, x)

返回由 (x, y) 对作为 float 确定的最小二乘拟合线性方程的斜率,如果没有任何匹配的行,则返回 None

RegrSXX

class RegrSXX(y, x)

返回作为 floatsum(x^2) - sum(x)^2/N (“自变量的平方和”),如果没有任何匹配的行,则返回 None

RegrSXY

class RegrSXY(y, x)

返回作为 floatsum(x*y) - sum(x) * sum(y)/N (“独立时间相关变量的乘积和”),如果没有任何匹配的行,则返回 None

RegrSYY

class RegrSYY(y, x)

返回作为 floatsum(y^2) - sum(y)^2/N (“因变量的平方和”),如果没有任何匹配的行,则返回 None

用法示例

我们将使用这个示例表:

| FIELD1 | FIELD2 | FIELD3 |
|--------|--------|--------|
|    foo |      1 |     13 |
|    bar |      2 | (null) |
|   test |      3 |     13 |

下面是一些通用聚合函数的一些示例:

>>> TestModel.objects.aggregate(result=StringAgg('field1', delimiter=';'))
{'result': 'foo;bar;test'}
>>> TestModel.objects.aggregate(result=ArrayAgg('field2'))
{'result': [1, 2, 3]}
>>> TestModel.objects.aggregate(result=ArrayAgg('field1'))
{'result': ['foo', 'bar', 'test']}

下一个示例显示统计聚合函数的用法。底层的数学将不会被描述(你可以阅读这个,例如,在 维基百科):

>>> TestModel.objects.aggregate(count=RegrCount(y='field3', x='field2'))
{'count': 2}
>>> TestModel.objects.aggregate(avgx=RegrAvgX(y='field3', x='field2'),
...                             avgy=RegrAvgY(y='field3', x='field2'))
{'avgx': 2, 'avgy': 13}