PostgreSQL HAVING - Filter groups
This article describes how to use the HAVING clause specify filter conditions for grouped queries.
In PostgreSQL, the HAVING clause is used to specify filter conditions for grouped queries with the GROUP BY clause.
The HAVING is similar to WHERE. Although they both specify filter conditions, but their difference is: the conditions specified by the WHERE clause is used to filter rows in the table, while the conditions specified by the HAVING clause are used to filter groups.
PostgreSQL HAVING syntax
The PostgreSQL HAVING clause must be used with the GROUP BY clause. The following are typical usages of the HAVING clause:
SELECT column1[, column2, ...], aggregate_function(ci)
FROM table
[WHERE clause]
GROUP BY column1[, column2, ...];
HAVING clause
Explanation:
- The
GROUP BYclause is used to specify the column or expression to use for grouping. - The
HAVINGclause is used to filter the grouped data. It requires a logical expression as a condition, where the column name or expression in the logical expression can only be the column, expression, or aggregate function applied toGROUP BYclause. - You cannot use column aliases in the
HAVINGclause.
PostgreSQL HAVING Examples
We will use the tables in the Sakila sample database for demonstration, please install the Sakila sample database in PostgreSQL first.
Example for PostgreSQL HAVING clause and the COUNT function
If you wanted to find the number of films for each film rating from the film table, use the following statement:
SELECT rating, count(*)
FROM film
GROUP BY rating
ORDER BY count(*) DESC;
rating | count
--------+-------
PG-13 | 223
NC-17 | 210
R | 195
PG | 194
G | 178
(5 rows)This example returns the number of films for all film ratings. If you want to find ratings for films with more than 200 films, use the HAVING clause, as following:
SELECT rating, count(*)
FROM film
GROUP BY rating
HAVING count(*) > 200
ORDER BY count(*) DESC;
rating | count
--------+-------
PG-13 | 223
NC-17 | 210
(2 rows)Example for PostgreSQL HAVING clause with the SUM function
The following example uses GROUP BY clause, HAVING clause, and the sum() function to find customers with a total spend of more than $180 from the payment table.
SELECT customer_id, sum(amount) total
FROM payment
GROUP BY customer_id
HAVING sum(amount) > 180
ORDER BY total DESC;
customer_id | total
-------------+--------
526 | 221.55
148 | 216.54
144 | 195.58
178 | 194.61
137 | 194.61
459 | 186.62
(6 rows)In this example, the steps of execution is as follows:
- First, the
GROUP BYclause group all rows by thecustomer_idcolumn. - Then, use the aggregate function
sum(amount)to sum theamountcolumns of all rows in each group and usetotalas the column alias. - Then, use the
HAVINGclause to filter the groups that meetssum(amount)is greater than180. - Finally, use the
ORDER BYclause to sort groups in descending order.
Conclusion
PostgreSQL HAVING clause is used to specify filter conditions for grouped queries with GROUP BY clauses.