diff --git a/doc/src/sgml/query.sgml b/doc/src/sgml/query.sgml
index 9046d7c9fbe..a864d146f02 100644
--- a/doc/src/sgml/query.sgml
+++ b/doc/src/sgml/query.sgml
@@ -706,40 +706,39 @@ SELECT city FROM weather
HAVING
Aggregates are also very useful in combination with GROUP
- BY clauses. For example, we can get the maximum low
- temperature observed in each city with:
+ BY clauses. For example, we can get the number of readings
+ and the maximum low temperature observed in each city with:
-SELECT city, max(temp_lo)
+SELECT city, count(*), max(temp_lo)
FROM weather
GROUP BY city;
- city | max
----------------+-----
- Hayward | 37
- San Francisco | 46
+ city | count | max
+---------------+-------+-----
+ Hayward | 1 | 37
+ San Francisco | 2 | 46
(2 rows)
which gives us one output row per city. Each aggregate result is
computed over the table rows matching that city.
We can filter these grouped
- rows using HAVING and the output count using
- FILTER:
+ rows using HAVING:
-SELECT city, max(temp_lo), count(*) FILTER (WHERE temp_lo < 30)
+SELECT city, count(*), max(temp_lo)
FROM weather
GROUP BY city
HAVING max(temp_lo) < 40;
- city | max | count
----------+-----+-------
- Hayward | 37 | 5
+ city | count | max
+---------+-------+-----
+ Hayward | 1 | 37
(1 row)
@@ -749,12 +748,18 @@ SELECT city, max(temp_lo), count(*) FILTER (WHERE temp_lo < 30)
names begin with S
, we might do:
-SELECT city, max(temp_lo), count(*) FILTER (WHERE temp_lo < 30)
+SELECT city, count(*), max(temp_lo)
FROM weather
WHERE city LIKE 'S%' --
- GROUP BY city
- HAVING max(temp_lo) < 40;
+ GROUP BY city;
+
+
+ city | count | max
+---------------+-------+-----
+ San Francisco | 2 | 46
+(1 row)
+
@@ -791,6 +796,34 @@ SELECT city, max(temp_lo), count(*) FILTER (WHERE temp_lo < 30)
because we avoid doing the grouping and aggregate calculations
for all rows that fail the WHERE check.
+
+
+ Another way to select the rows that go into an aggregate
+ computation is to use FILTER, which is a
+ per-aggregate option:
+
+
+SELECT city, count(*) FILTER (WHERE temp_lo < 45), max(temp_lo)
+ FROM weather
+ GROUP BY city;
+
+
+
+ city | count | max
+---------------+-------+-----
+ Hayward | 1 | 37
+ San Francisco | 1 | 46
+(2 rows)
+
+
+ FILTER is much like WHERE,
+ except that it removes rows only from the input of the particular
+ aggregate function that it is attached to.
+ Here, the count aggregate counts only
+ rows with temp_lo below 45; but the
+ max aggregate is still applied to all rows,
+ so it still finds the reading of 46.
+