Перейти к основному содержимому

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

select
customer_id,
count(order_id) as num_orders
from {{ ref('orders') }}
group by 1
having num_orders > 1 --если заменить это на `where`, запрос не выполнится успешно

Этот простой запрос, использующий пример набора данных таблицы orders из Jaffle Shop’s, вернет клиентов, у которых было более одного заказа:

customer_idnum_orders
12
33
942
642
544

Запрос выше, использующий , использует больше строк по сравнению с более простым запросом с использованием HAVING, но даст тот же результат.

Синтаксис предложения SQL HAVING в Snowflake, Databricks, BigQuery и Redshift

Snowflake, Databricks, BigQuery и Redshift все поддерживают предложение HAVING, и синтаксис для использования HAVING одинаков во всех этих хранилищах данных.

0