summaryrefslogtreecommitdiff
path: root/doc/src/sgml/queries.sgml
diff options
context:
space:
mode:
Diffstat (limited to 'doc/src/sgml/queries.sgml')
-rw-r--r--doc/src/sgml/queries.sgml53
1 files changed, 52 insertions, 1 deletions
diff --git a/doc/src/sgml/queries.sgml b/doc/src/sgml/queries.sgml
index 283dd0a73d..f1db64b273 100644
--- a/doc/src/sgml/queries.sgml
+++ b/doc/src/sgml/queries.sgml
@@ -1,4 +1,4 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/queries.sgml,v 1.50 2008/10/14 00:41:34 tgl Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/queries.sgml,v 1.51 2008/12/28 18:53:54 tgl Exp $ -->
<chapter id="queries">
<title>Queries</title>
@@ -949,6 +949,57 @@ SELECT product_id, p.name, (sum(s.units) * (p.price - p.cost)) AS profit
5000. Note that the aggregate expressions do not necessarily need
to be the same in all parts of the query.
</para>
+
+ <para>
+ If a query contains aggregate function calls, but no <literal>GROUP BY</>
+ clause, grouping still occurs: the result is a single group row (or
+ perhaps no rows at all, if the single row is then eliminated by
+ <literal>HAVING</>).
+ The same is true if it contains a <literal>HAVING</> clause, even
+ without any aggregate function calls or <literal>GROUP BY</> clause.
+ </para>
+ </sect2>
+
+ <sect2 id="queries-window">
+ <title>Window Function Processing</>
+
+ <indexterm zone="queries-window">
+ <primary>window function</primary>
+ <secondary>order of execution</>
+ </indexterm>
+
+ <para>
+ If the query contains any window functions (see
+ <xref linkend="tutorial-window"> and
+ <xref linkend="syntax-window-functions">), these functions are evaluated
+ after any grouping, aggregation, and <literal>HAVING</> filtering is
+ performed. That is, if the query uses any aggregates, <literal>GROUP
+ BY</>, or <literal>HAVING</>, then the rows seen by the window functions
+ are the group rows instead of the original table rows from
+ <literal>FROM</>/<literal>WHERE</>.
+ </para>
+
+ <para>
+ When multiple window functions are used, all the window functions having
+ syntactically equivalent <literal>PARTITION BY</> and <literal>ORDER BY</>
+ clauses in their window definitions are guaranteed to be evaluated in a
+ single pass over the data. Therefore they will see the same sort ordering,
+ even if the <literal>ORDER BY</> does not uniquely determine an ordering.
+ However, no guarantees are made about the evaluation of functions having
+ different <literal>PARTITION BY</> or <literal>ORDER BY</> specifications.
+ (In such cases a sort step is typically required between the passes of
+ window function evaluations, and the sort is not guaranteed to preserve
+ ordering of rows that its <literal>ORDER BY</> sees as equivalent.)
+ </para>
+
+ <para>
+ Currently, use of window functions always forces sorting, and so the
+ query output will be ordered according to one or another of the window
+ functions' <literal>PARTITION BY</>/<literal>ORDER BY</> clauses.
+ It is not recommendable to rely on this, however. Use an explicit
+ top-level <literal>ORDER BY</> clause if you want to be sure the
+ results are sorted in a particular way.
+ </para>
</sect2>
</sect1>