Специальные функции агрегирования 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 BooleanField, 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), output_field=BooleanField())) {'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 BooleanField, 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), output_field=BooleanField())) {'boolor': False}
JSONBAgg
¶
-
class
JSONBAgg
( выражения , filter = None , ** extra ) ¶ Возвращает входные значения в виде массива
JSON
.
StringAgg
¶
-
класс
StringAgg
( выражение , разделитель , отдельный = Ложь , фильтр = Нет , упорядочение = () ) ¶ Возвращает входные значения, объединенные в строку, разделенную строкой
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 для линейного уравнения наименьших квадратов, определяемого парами, в виде числа или, если ни одна строка не соответствует.
(x, y)
float
None
RegrR2
¶
-
class
RegrR2
( y , x , filter = None ) ¶ Возвращает квадрат коэффициента корреляции как
float
или,None
если совпадающих строк нет.
RegrSlope
¶
-
class
RegrSlope
( y , x , filter = None ) ¶ Возвращает наклон для линейного уравнения наименьших квадратов, определенного парами, в виде числа или, если ни одна строка не соответствует.
(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}