mirror of
https://github.com/postgres/postgres.git
synced 2025-07-09 22:41:56 +03:00
Add an example to clarify the use of ORDER BY in multiple-argument
aggregates. People seem to not get this right without help.
This commit is contained in:
@ -1,4 +1,4 @@
|
|||||||
<!-- $PostgreSQL: pgsql/doc/src/sgml/syntax.sgml,v 1.148 2010/07/20 00:34:44 rhaas Exp $ -->
|
<!-- $PostgreSQL: pgsql/doc/src/sgml/syntax.sgml,v 1.149 2010/08/04 15:27:57 tgl Exp $ -->
|
||||||
|
|
||||||
<chapter id="sql-syntax">
|
<chapter id="sql-syntax">
|
||||||
<title>SQL Syntax</title>
|
<title>SQL Syntax</title>
|
||||||
@ -1567,7 +1567,7 @@ sqrt(2)
|
|||||||
unspecified order. In many cases this does not matter; for example,
|
unspecified order. In many cases this does not matter; for example,
|
||||||
<function>min</> produces the same result no matter what order it
|
<function>min</> produces the same result no matter what order it
|
||||||
receives the inputs in. However, some aggregate functions
|
receives the inputs in. However, some aggregate functions
|
||||||
(such as <function>array_agg</> and <function>xmlagg</>) produce
|
(such as <function>array_agg</> and <function>string_agg</>) produce
|
||||||
results that depend on the ordering of the input rows. When using
|
results that depend on the ordering of the input rows. When using
|
||||||
such an aggregate, the optional <replaceable>order_by_clause</> can be
|
such an aggregate, the optional <replaceable>order_by_clause</> can be
|
||||||
used to specify the desired ordering. The <replaceable>order_by_clause</>
|
used to specify the desired ordering. The <replaceable>order_by_clause</>
|
||||||
@ -1575,12 +1575,26 @@ sqrt(2)
|
|||||||
described in <xref linkend="queries-order">, except that its expressions
|
described in <xref linkend="queries-order">, except that its expressions
|
||||||
are always just expressions and cannot be output-column names or numbers.
|
are always just expressions and cannot be output-column names or numbers.
|
||||||
For example:
|
For example:
|
||||||
|
|
||||||
<programlisting>
|
<programlisting>
|
||||||
SELECT array_agg(a ORDER BY b DESC) FROM table;
|
SELECT array_agg(a ORDER BY b DESC) FROM table;
|
||||||
</programlisting>
|
</programlisting>
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
When dealing with multiple-argument aggregate functions, note that the
|
||||||
|
<literal>ORDER BY</> clause goes after all the aggregate arguments.
|
||||||
|
For example, this:
|
||||||
|
<programlisting>
|
||||||
|
SELECT string_agg(a, ',' ORDER BY a) FROM table;
|
||||||
|
</programlisting>
|
||||||
|
not this:
|
||||||
|
<programlisting>
|
||||||
|
SELECT string_agg(a ORDER BY a, ',') FROM table; -- not what you want
|
||||||
|
</programlisting>
|
||||||
|
The latter syntax will be accepted, but <literal>','</> will be
|
||||||
|
treated as a (useless) sort key.
|
||||||
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
If <literal>DISTINCT</> is specified in addition to an
|
If <literal>DISTINCT</> is specified in addition to an
|
||||||
<replaceable>order_by_clause</>, then all the <literal>ORDER BY</>
|
<replaceable>order_by_clause</>, then all the <literal>ORDER BY</>
|
||||||
|
Reference in New Issue
Block a user