Специальные функции агрегирования PostgreSQL

Эти функции доступны из django.contrib.postgres.aggregates модуля. Более подробно они описаны в документации PostgreSQL .

Примечание

Все функции поставляются без псевдонимов по умолчанию, поэтому вы должны явно указать их. Например:

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

Общие параметры агрегирования

Все агрегаты имеют аргумент ключевого слова фильтра .

Функции агрегирования общего назначения

ArrayAgg

classArrayAgg ( выражение , отличное = False , filter = None , ordering = () , ** extra )

Возвращает список значений, включая нули, объединенных в массив.

distinct

Необязательный логический аргумент, определяющий, будут ли значения массива отличаться друг от друга. По умолчанию False.

ordering

Необязательная строка имени поля (с необязательным "-"префиксом, который указывает порядок убывания) или выражения (или кортежа, или списка строк и / или выражений), определяющего порядок элементов в списке результатов.

Примеры:

'some_field'
'-some_field'
from django.db.models import F
F('some_field').desc()

BitAnd

classBitAnd ( выражение , filter = None , ** extra )

Возвращает intпобитовое ANDиз всех ненулевых входных значений или, Noneесли все значения равны нулю.

BitOr

classBitOr ( выражение , filter = None , ** extra )

Возвращает intпобитовое ORиз всех ненулевых входных значений или, Noneесли все значения равны нулю.

BoolAnd

classBoolAnd ( выражение , 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

classBoolOr ( выражение , 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

classJSONBAgg ( выражения , разные = False , filter = None , ordering = () , ** extra )

Возвращает входные значения в виде JSONмассива.

distinct
Новое в Django 3.2.

Необязательный логический аргумент, определяющий, будут ли значения массива отличаться друг от друга. По умолчанию False.

ordering
Новое в Django 3.2.

Необязательная строка имени поля (с необязательным "-"префиксом, который указывает порядок убывания) или выражения (или кортежа, или списка строк и / или выражений), определяющего порядок элементов в списке результатов.

Примеры такие же, как для ArrayAgg.ordering.

StringAgg

classStringAgg ( выражение , разделитель , отличное = False , filter = None , ordering = () )

Возвращает входные значения, объединенные в строку, разделенную delimiterстрокой.

delimiter

Обязательный аргумент. Должен быть строкой.

distinct

Необязательный логический аргумент, определяющий, будут ли объединенные значения отличаться друг от друга. По умолчанию False.

ordering

Необязательная строка имени поля (с необязательным "-"префиксом, который указывает порядок убывания) или выражения (или кортежа или списка строк и / или выражений), определяющего порядок элементов в строке результата.

Примеры такие же, как для ArrayAgg.ordering.

Агрегатные функции для статистики

yи x

Аргументами yи xдля всех этих функций может быть имя поля или выражение, возвращающее числовые данные. Оба требуются.

Corr

classCorr ( y , x , filter = None )

Возвращает коэффициент корреляции как floatили, Noneесли совпадающих строк нет.

CovarPop

classCovarPop ( y , x , sample = False , filter = None )

Возвращает ковариацию генеральной совокупности в виде floatили, Noneесли совпадающих строк нет.

Имеет один необязательный аргумент:

sample

По умолчанию CovarPopвозвращает ковариацию генеральной совокупности. Однако, если sample=True, возвращаемое значение будет ковариацией выборки генеральной совокупности.

RegrAvgX

classRegrAvgX ( y , x , filter = None )

Возвращает среднее значение независимой переменной ( sum(x)/N) как floatили, Noneесли совпадающих строк нет.

RegrAvgY

classRegrAvgY ( y , x , filter = None )

Возвращает среднее значение зависимой переменной ( sum(y)/N) как floatили, Noneесли совпадающих строк нет.

RegrCount

classRegrCount ( y , x , filter = None )

Возвращает intчисло входных строк, в которых оба выражения не равны нулю.

RegrIntercept

classRegrIntercept ( y , x , filter = None )

Возвращает точку пересечения оси Y линейного уравнения методом наименьших квадратов, определяемого парами, как a , или в случае отсутствия совпадающих строк.(x, y)floatNone

RegrR2

classRegrR2 ( y , x , filter = None )

Возвращает квадрат коэффициента корреляции как floatили, Noneесли совпадающих строк нет.

RegrSlope

classRegrSlope ( y , x , filter = None )

Возвращает наклон линейного уравнения методом наименьших квадратов, определяемого парами, как a , или, если совпадающих строк нет.(x, y)floatNone

RegrSXX

classRegrSXX ( y , x , filter = None )

Возвращает («сумму квадратов» независимой переменной) как или, если совпадающих строк нет.sum(x^2) - sum(x)^2/NfloatNone

RegrSXY

classRegrSXY ( y , x , filter = None )

Возвращает («сумму произведений» независимой переменной, зависящей от времени) в виде или, если совпадающих строк нет.sum(x*y) - sum(x) * sum(y)/NfloatNone

RegrSYY

classRegrSYY ( y , x , filter = None )

Возвращает («сумму квадратов» зависимой переменной) как или, если совпадающих строк нет.sum(y^2) - sum(y)^2/NfloatNone

Примеры использования

Мы будем использовать этот пример таблицы:

| 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}

Copyright ©2021 All rights reserved