CodeRang
Диалекты

BigQuery SQL: примеры и практика GoogleSQL

BigQuery SQL отличается рядом конструкций, которые особенно полезны в аналитических запросах. На примерах можно разобраться с QUALIFY, оконными функциями, ARRAY, UNNEST, STRUCT и другими возможностями GoogleSQL.

Обновлено · Команда SQL Arena

Что потренируете

  • Отбирать строки после оконных функций через QUALIFY
  • Исключать служебные поля конструкцией SELECT * EXCEPT
  • Разворачивать массивы через UNNEST и собирать ARRAY
  • Работать со STRUCT и вложенными полями
  • Практиковать BigQuery SQL в браузере без настройки облачного проекта

Пример задачи в тренажёре

Так выглядит задача в SQL Arena: условие, редактор, результат и схема базы.

Пред.След.Случайная
ЗаданиеОтправкиAI Mentor
Найдите последнее событие каждого клиента

В таблице customer_events хранится история действий клиентов. Для каждого клиента выведите его последнее событие: customer_id, event_type и event_time. Если событий несколько, нужна только самая поздняя строка. Отсортируйте результат по customer_id.

Запрос 1BigQueryGoogleSQL
SELECT
  customer_id,
  event_type,
  event_time
FROM customer_events
QUALIFY ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY event_time DESC) = 1
ORDER BY customer_id;
Отправить
Результатcustomerscustomer_events
Ответ принят

Разбор BigQuery SQL на примере с QUALIFY

ROW_NUMBER() нумерует события внутри каждого customer_id. PARTITION BY начинает нумерацию заново для каждого клиента, а ORDER BY event_time DESC ставит самое позднее событие на первое место. Поэтому нужная строка получает номер 1, а остальные события того же клиента — 2, 3 и дальше.

Главная деталь здесь — QUALIFY. Эта секция фильтрует строки после вычисления оконных функций, поэтому не нужен внешний SELECT только ради условия row_number = 1. В диалектах без QUALIFY такую задачу часто решают через CTE или подзапрос. В BigQuery запрос можно оставить плоским: сначала описать окно, затем сразу отобрать нужную строку.

Финальный ORDER BY customer_id не участвует в выборе последнего события. Он только задаёт стабильный порядок вывода. Если в реальных данных возможны два события с одинаковым event_time, в ORDER BY внутри окна стоит добавить ещё один критерий, например id DESC, чтобы правило выбора не зависело от случайного порядка.

BigQuery использует GoogleSQL — SQL-диалект с поддержкой массивов, структур и вложенных данных. ARRAY хранит несколько значений внутри одного поля, STRUCT объединяет несколько именованных полей в одну структуру, а UNNEST превращает элементы массива в строки, с которыми можно работать в запросе. Ещё одна полезная конструкция — QUALIFY: она фильтрует результат после вычисления оконных функций. Поэтому задачу вроде выбора последней записи для каждого пользователя часто можно решить без дополнительного CTE или внешнего подзапроса.

SQLBigQuery GoogleSQL
SELECT
  customer_id,
  event_type,
  event_time
FROM customer_events
QUALIFY ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY event_time DESC) = 1
ORDER BY customer_id;
Результат запроса
customer_idevent_typeevent_time
1purchase2026-04-04 12:30:00 UTC
2purchase2026-04-06 16:10:00 UTC
3signup2026-04-03 11:20:00 UTC
4trial2026-04-07 09:45:00 UTC
5purchase2026-04-08 18:00:00 UTC

Типичные ошибки в запросах BigQuery SQL

01

Пытаться фильтровать ROW_NUMBER через WHERE

WHERE применяется до вычисления оконных функций, поэтому условие по ROW_NUMBER() туда не подходит. В BigQuery для фильтрации результата окна есть QUALIFY.

02

Разворачивать ARRAY как обычную таблицу

Массив нельзя использовать так, будто каждый его элемент уже стал отдельной строкой. Для повторяющихся значений нужен UNNEST, после которого элементы можно фильтровать, соединять с другими данными и агрегировать.

03

Всегда писать SELECT *

В аналитической таблице часто есть несколько служебных колонок, которые не нужны в результате. Если требуется почти вся строка, BigQuery позволяет короче выразить намерение через SELECT * EXCEPT и перечислить только исключаемые поля.

Задачи по теме в тренажёре

Курс BigQuery

После QUALIFY стоит потренироваться на других конструкциях, которые часто встречаются именно в BigQuery. В задачах тренажёра можно убирать служебные поля из журнала через SELECT * EXCEPT, получать дни недели, работать с более узкими выборками и переходить к массивам и вложенным данным. Отдельные задачи посвящены корзинам, где без ARRAY и UNNEST уже не обойтись. В SQL Arena BigQuery работает в собственной песочнице прямо в браузере: для такой практики не нужно настраивать облачный проект или отдельный счёт. Решения проходят автопроверку на скрытых данных, поэтому запрос должен корректно работать не только на примере из условия. Всего в SQL Arena 1 192 задачи, причём у каждой задачи свои таблицы. Бесплатный тариф без карты включает 292 задачи на четырёх диалектах, в том числе BigQuery. Для последовательного изучения есть Курс BigQuery: в уроках теория сразу закрепляется задачей, первые главы доступны бесплатно. Схему данных можно смотреть в ER-диаграмме, а для разбора запросов доступен EXPLAIN. AI-ментор даёт подсказки и объясняет ошибки, бесплатно доступны 10 обращений. Отдельно можно включить режим «Собеседование»: он работает без подсказок, использует серверный таймер и после сессии показывает отчёт; одна попытка в день бесплатна.

Справочник по теме

Подробные статьи с синтаксисом и примерами в справочнике SQL Arena.

Частые вопросы

Что такое BigQuery SQL?

BigQuery использует диалект GoogleSQL для запросов к данным. Он поддерживает привычные SELECT, JOIN и GROUP BY, а также конструкции для аналитики и вложенных данных, включая QUALIFY, ARRAY, STRUCT и UNNEST.

Как писать запросы в BigQuery?

Запрос строится по обычным принципам SQL, но важно учитывать особенности GoogleSQL. Например, QUALIFY можно использовать для фильтрации результатов оконных функций, а UNNEST — для раскрытия массивов.

Для чего нужен QUALIFY в BigQuery?

QUALIFY фильтрует строки после вычисления оконных функций. Это позволяет, например, оставить строку с ROW_NUMBER() = 1 для каждой группы без отдельного внешнего SELECT.

Как работать с массивами в BigQuery?

Массивы представлены типом ARRAY и могут содержать несколько значений внутри одной строки. Чтобы превратить элементы массива в отдельные строки для фильтрации, соединения или агрегации, обычно используют UNNEST.

Практика BigQuery SQL на задачах

Начните с бесплатных задач в BigQuery-песочнице, а затем переходите к Курсу BigQuery, если нужен последовательный путь от базовых запросов к массивам и вложенным данным.

Решать задачи BigQuery