Spec-Zone.ru › Django 3.1

Функции агрегирования, специфичные для PostgreSQL

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

Примечание

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

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

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

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

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

ArrayAgg

class ArrayAgg(expression, distinct=False, filter=None, ordering=(), **extra)

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

distinct

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

ordering

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

Примеры:

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

BitAnd

class BitAnd(expression, filter=None, **extra)

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

BitOr

class BitOr(expression, filter=None, **extra)

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

BoolAnd

class BoolAnd(expression, 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(expression, 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(expressions, filter=None, **extra)

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

StringAgg

class StringAgg(expression, delimiter, distinct=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 количества входных строк, в которых оба выражения не равны NULL.

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 если нет подходящих строк.

RegrSXY

class RegrSXY(y, x, filter=None)

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

RegrSYY

class RegrSYY(y, x, filter=None)

Возвращает sum(y^2) - sum(y)^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}

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/3.1/ref/contrib/postgres/aggregates/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API