SQL HAVING
SQL HAVING — это одна из тех мелочей, которые сделают вашу работу с данными немного проще.
Не очень приятный факт о WHERE clause заключается в том, что с его помощью нельзя фильтровать агрегаты... и вот тут на помощь приходит HAVING. С HAVING вы можете не только определить агрегат в select запросе, но и фильтровать по этому вновь созданному агрегату в предложении HAVING.
На этой странице мы рассмотрим, как использовать HAVING, когда его следует использовать, и обсудим поддержку этого предложения в различных хранилищах данных.
Как использовать предложение HAVING в SQL
Предложение HAVING по сути требует одного: агрегатного поля для оценки. Поскольку HAVING технически является булевым, он будет возвращать строки, которые выполняются как истинные, аналогично предложению WHERE.
Условие HAVING следует после GROUP BY statement и может быть дополнительно заключено в ORDER BY:
select
-- запрос
from <table>
group by <field(s)>
having condition
[optional order by]
Этот пример синтаксиса выглядит немн ого непонятно без реальных полей, поэтому давайте рассмотрим практический пример использования HAVING.
Пример использования SQL HAVING
- Пример HAVING
- Пример CTE
select
customer_id,
count(order_id) as num_orders
from {{ ref('orders') }}
group by 1
having num_orders > 1 --если заменить это на `where`, запрос не выполнится успешно
with counts as (
select
customer_id,
count(order_id) as num_orders
from {{ ref('orders') }}
group by 1
)
select
customer_id,
num_orders
from counts
where num_orders > 1
Этот простой запрос, использующий пример набора данных таблицы orders
из Jaffle Shop’s, вернет клиентов, у которых было более одного заказа:
customer_id | num_orders |
---|---|
1 | 2 |
3 | 3 |
94 | 2 |
64 | 2 |
54 | 4 |
Запрос выше, использующий , использует больше строк по сравнению с более простым запросом с использованием HAVING, но даст тот же результат.
Синтаксис предложения SQL HAVING в Snowflake, Databricks, BigQuery и Redshift
Snowflake, Databricks, BigQuery и Redshift все поддерживают предложение HAVING, и синтаксис для использования HAVING одинаков во всех этих хранилищах данных.