Simple aggregates return one row as a result. It is
often desirable, however, to apply an aggregate to groups of rows. In queries
using aggregates with GROUP BY, the aggregate is applied to rows grouped
by another column in the table. For example, SELECT COUNT(*) FROM
friend returns the total number of rows in the table. The query in Figure
shows the use of GROUP BY to count the number of people in each state.
With GROUP BY, the table is split up into groups by state, and
COUNT(*) is applied to each group in turn.
test=> SELECT state, COUNT(*)
test-> FROM friend
test-> GROUP BY state;
state | count
-------+-------
MA | 2
MD | 1
NJ | 2
PA | 1
(4 rows)
test=> SELECT state, MIN(age), MAX(age), AVG(age)
test-> FROM friend
test-> GROUP BY state
test-> ORDER BY 4 DESC;
state | min | max | avg
-------+-----+-----+-----
MA | 24 | 33 | 28
MD | 27 | 27 | 27
NJ | 19 | 25 | 22
PA | 22 | 22 | 22
(4 rows)
The second query shows the minimum, maximum, and average ages of the people in each state. It also shows an ORDER BY operation carried out on the aggregate column. Because the column is the fourth one in the result, you can identify it by the number 4. Using ORDER BY avg would have worked as well.
You can GROUP BY more than one column, as shown in Figure .
test=> SELECT city, state, COUNT(*)
test-> FROM friend
test-> GROUP BY state, city
test-> ORDER BY 1, 2;
city | state | count
-----------------+-------+-------
Boston | MA | 1
Cedar Creek | MD | 1
Ocean City | NJ | 2
Plymouth | MA | 1
Williamsport | PA | 1
(5 rows)
GROUP BY collects all NULL values into a single group.