9.20. 彙總函數
版本:11
彙總函數將一組輸入值計算為單一個結果。Table 9.52 中列出了內建的通用彙總函數,Table 9.53 中列出了統計的彙總函數。Table 9.54 中列出了內建的群組內有序集合函數,而內建的群組內假設集合函數列於 Table 9.55 中。Table 9.56 列出了與彙總函數密切相關的分組操作。第 4.2.7 節介紹了彙總函數的特殊語法注意事項。有關其他介紹性資訊,請參閱第 2.7 節。
Table 9.52. General-Purpose Aggregate Functions
It should be noted that except for count
, these functions return a null value when no rows are selected. In particular, sum
of no rows returns null, not zero as one might expect, and array_agg
returns null rather than an empty array when there are no input rows. The coalesce
function can be used to substitute zero or an empty array for null when necessary.
Aggregate functions which support Partial Mode are eligible to participate in various optimizations, such as parallel aggregation.
Note
Boolean aggregates bool_and
and bool_or
correspond to standard SQL aggregates every
and any
or some
. As for any
and some
, it seems that there is an ambiguity built into the standard syntax:
Here ANY
can be considered either as introducing a subquery, or as being an aggregate function, if the subquery returns one row with a Boolean value. Thus the standard name cannot be given to these aggregates.
Note
Users accustomed to working with other SQL database management systems might be disappointed by the performance of the count
aggregate when it is applied to the entire table. A query like:
will require effort proportional to the size of the table: PostgreSQL will need to scan either the entire table or the entirety of an index which includes all rows in the table.
The aggregate functions array_agg
, json_agg
, jsonb_agg
, json_object_agg
, jsonb_object_agg
, string_agg
, and xmlagg
, as well as similar user-defined aggregate functions, produce meaningfully different result values depending on the order of the input values. This ordering is unspecified by default, but can be controlled by writing an ORDER BY
clause within the aggregate call, as shown in Section 4.2.7. Alternatively, supplying the input values from a sorted subquery will usually work. For example:
Beware that this approach can fail if the outer query level contains additional processing, such as a join, because that might cause the subquery's output to be reordered before the aggregate is computed.
Table 9.53 shows aggregate functions typically used in statistical analysis. (These are separated out merely to avoid cluttering the listing of more-commonly-used aggregates.) Where the description mentions N
, it means the number of input rows for which all the input expressions are non-null. In all cases, null is returned if the computation is meaningless, for example when N
is zero.
Table 9.53. Aggregate Functions for Statistics
Table 9.54 shows some aggregate functions that use the ordered-set aggregate syntax. These functions are sometimes referred to as “inverse distribution” functions.
Table 9.54. Ordered-Set Aggregate Functions
All the aggregates listed in Table 9.54 ignore null values in their sorted input. For those that take a fraction
parameter, the fraction value must be between 0 and 1; an error is thrown if not. However, a null fraction value simply produces a null result.
Each of the aggregates listed in Table 9.55 is associated with a window function of the same name defined in Section 9.21. In each case, the aggregate result is the value that the associated window function would have returned for the “hypothetical” row constructed from args
, if such a row had been added to the sorted group of rows computed from the sorted_args
.
Table 9.55. Hypothetical-Set Aggregate Functions
For each of these hypothetical-set aggregates, the list of direct arguments given in args
must match the number and types of the aggregated arguments given in sorted_args
. Unlike most built-in aggregates, these aggregates are not strict, that is they do not drop input rows containing nulls. Null values sort according to the rule specified in the ORDER BY
clause.
Table 9.56. Grouping Operations
Grouping operations are used in conjunction with grouping sets (see Section 7.2.4) to distinguish result rows. The arguments to the GROUPING
operation are not actually evaluated, but they must match exactly expressions given in the GROUP BY
clause of the associated query level. Bits are assigned with the rightmost argument being the least-significant bit; each bit is 0 if the corresponding expression is included in the grouping criteria of the grouping set generating the result row, and 1 if it is not. For example:
Last updated