PostgreSQL固有の集計関数—Djangoドキュメント
PostgreSQL固有の集計関数
これらの機能は、django.contrib.postgres.aggregates
モジュールから利用できます。 これらについては、 PostgreSQLドキュメントで詳しく説明されています。
ノート
すべての関数にはデフォルトのエイリアスがないため、明示的に指定する必要があります。 例えば:
>>> SomeModel.objects.aggregate(arr=ArrayAgg('somefield'))
{'arr': [0, 1, 2]}
汎用集計関数
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)
- null以外のすべての入力値のビット単位の
AND
のint
を返します。すべての値がnullの場合は、None
を返します。
BitOr
- class BitOr(expression, filter=None, **extra)
- null以外のすべての入力値のビット単位の
OR
のint
を返します。すべての値がnullの場合は、None
を返します。
BoolAnd
- class BoolAnd(expression, filter=None, **extra)
すべての入力値がtrueの場合は
True
を返し、すべての値がnullの場合は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(expression, filter=None, **extra)
少なくとも1つの入力値がtrueの場合は
True
を返し、すべての値がnullの場合は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(expressions, distinct=False, filter=None, ordering=(), **extra)
入力値を
JSON
配列として返します。- distinct
バージョン3.2の新機能。
配列値を区別するかどうかを決定するオプションのブール引数。 デフォルトは
False
です。
- ordering
バージョン3.2の新機能。
フィールド名のオプションの文字列(降順を示すオプションの
"-"
プレフィックス付き)または結果リスト内の要素の順序を指定する式(または文字列や式のタプルまたはリスト) 。例は ArrayAgg.ordering の場合と同じです。
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
として返します。オプションの引数が1つあります。
- 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)
- 両方の式がnullでない入力行数の
int
を返します。
RegrIntercept
- class RegrIntercept(y, x, filter=None)
(x, y)
ペアによって決定された最小二乗近似線形方程式のy切片をfloat
として、または一致する行がない場合はNone
として返します。
RegrR2
- class RegrR2(y, x, filter=None)
- 相関係数の2乗を
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']}
次の例は、統計集計関数の使用法を示しています。 基礎となる数学については説明しません(これについては、たとえば wikipedia で読むことができます)。
>>> 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}