Специальные функции агрегирования PostgreSQL ¶
Эти функции доступны из django.contrib.postgres.aggregates
модуля. Более подробно они описаны в документации PostgreSQL .
Примечание
Все функции поставляются без псевдонимов по умолчанию, поэтому вы должны явно указать их. Например:
>>> SomeModel.objects.aggregate(arr=ArrayAgg('somefield'))
{'arr': [0, 1, 2]}
Функции агрегирования общего назначения ¶
ArrayAgg
¶
-
class
ArrayAgg
( выражение , отличное = False , filter = None , ordering = () , ** extra ) ¶ Возвращает список значений, включая нули, объединенных в массив.
-
distinct
¶ Необязательный логический аргумент, определяющий, будут ли значения массива отличаться друг от друга. По умолчанию
False
.
-
ordering
¶ Необязательная строка имени поля (с необязательным
"-"
префиксом, который указывает порядок убывания) или выражения (или кортежа, или списка строк и / или выражений), определяющего порядок элементов в списке результатов.Примеры:
'some_field' '-some_field' from django.db.models import F F('some_field').desc()
-
BitAnd
¶
-
class
BitAnd
( выражение , filter = None , ** extra ) ¶ Возвращает
int
побитовоеAND
из всех ненулевых входных значений или,None
если все значения равны нулю.
BitOr
¶
-
class
BitOr
( выражение , filter = None , ** extra ) ¶ Возвращает
int
побитовоеOR
из всех ненулевых входных значений или,None
если все значения равны нулю.
BoolAnd
¶
-
class
BoolAnd
( выражение , filter = None , ** extra ) ¶ Возвращает
True
, если все входные значения верны,None
если все значения равны нулю или нет значений, в противном случаеFalse
.Пример использования:
class Comment(models.Model): body = models.TextField() published = models.BooleanField() rank = models.IntegerField() >>> from django.db.models import Q >>> from django.contrib.postgres.aggregates import BoolAnd >>> Comment.objects.aggregate(booland=BoolAnd('published')) {'booland': False} >>> Comment.objects.aggregate(booland=BoolAnd(Q(rank__lt=100))) {'booland': True}
BoolOr
¶
-
class
BoolOr
( выражение , filter = None , ** extra ) ¶ Возвращает,
True
если хотя бы одно входное значение истинно,None
если все значения равны нулю или нет значений, в противном случаеFalse
.Пример использования:
class Comment(models.Model): body = models.TextField() published = models.BooleanField() rank = models.IntegerField() >>> from django.db.models import Q >>> from django.contrib.postgres.aggregates import BoolOr >>> Comment.objects.aggregate(boolor=BoolOr('published')) {'boolor': True} >>> Comment.objects.aggregate(boolor=BoolOr(Q(rank__gt=2))) {'boolor': False}
JSONBAgg
¶
-
class
JSONBAgg
( выражения , разные = False , filter = None , ordering = () , ** extra ) ¶ Возвращает входные значения в виде
JSON
массива.-
distinct
¶ - Новое в Django 3.2.
Необязательный логический аргумент, определяющий, будут ли значения массива отличаться друг от друга. По умолчанию
False
.
-
ordering
¶ - Новое в Django 3.2.
Необязательная строка имени поля (с необязательным
"-"
префиксом, который указывает порядок убывания) или выражения (или кортежа, или списка строк и / или выражений), определяющего порядок элементов в списке результатов.Примеры такие же, как для
ArrayAgg.ordering
.
-
StringAgg
¶
-
class
StringAgg
( выражение , разделитель , отличное = False , filter = None , ordering = () ) ¶ Возвращает входные значения, объединенные в строку, разделенную
delimiter
строкой.-
delimiter
¶ Обязательный аргумент. Должен быть строкой.
-
distinct
¶ Необязательный логический аргумент, определяющий, будут ли объединенные значения отличаться друг от друга. По умолчанию
False
.
-
ordering
¶ Необязательная строка имени поля (с необязательным
"-"
префиксом, который указывает порядок убывания) или выражения (или кортежа или списка строк и / или выражений), определяющего порядок элементов в строке результата.Примеры такие же, как для
ArrayAgg.ordering
.
-
Агрегатные функции для статистики ¶
y
и x
¶
Аргументами y
и x
для всех этих функций может быть имя поля или выражение, возвращающее числовые данные. Оба требуются.
Corr
¶
-
class
Corr
( y , x , filter = None ) ¶ Возвращает коэффициент корреляции как
float
или,None
если совпадающих строк нет.
CovarPop
¶
-
class
CovarPop
( y , x , sample = False , filter = None ) ¶ Возвращает ковариацию генеральной совокупности в виде
float
или,None
если совпадающих строк нет.Имеет один необязательный аргумент:
-
sample
¶ По умолчанию
CovarPop
возвращает ковариацию генеральной совокупности. Однако, еслиsample=True
, возвращаемое значение будет ковариацией выборки генеральной совокупности.
-
RegrAvgX
¶
-
class
RegrAvgX
( y , x , filter = None ) ¶ Возвращает среднее значение независимой переменной (
sum(x)/N
) какfloat
или,None
если совпадающих строк нет.
RegrAvgY
¶
-
class
RegrAvgY
( y , x , filter = None ) ¶ Возвращает среднее значение зависимой переменной (
sum(y)/N
) какfloat
или,None
если совпадающих строк нет.
RegrCount
¶
-
class
RegrCount
( y , x , filter = None ) ¶ Возвращает
int
число входных строк, в которых оба выражения не равны нулю.
RegrIntercept
¶
-
class
RegrIntercept
( y , x , filter = None ) ¶ Возвращает точку пересечения оси Y линейного уравнения методом наименьших квадратов, определяемого парами, как a , или в случае отсутствия совпадающих строк.
(x, y)
float
None
RegrR2
¶
-
class
RegrR2
( y , x , filter = None ) ¶ Возвращает квадрат коэффициента корреляции как
float
или,None
если совпадающих строк нет.
RegrSlope
¶
-
class
RegrSlope
( y , x , filter = None ) ¶ Возвращает наклон линейного уравнения методом наименьших квадратов, определяемого парами, как a , или, если совпадающих строк нет.
(x, y)
float
None
RegrSXX
¶
-
class
RegrSXX
( y , x , filter = None ) ¶ Возвращает («сумму квадратов» независимой переменной) как или, если совпадающих строк нет.
sum(x^2) - sum(x)^2/N
float
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}