BigQuery SQL: примеры и практика GoogleSQL
BigQuery SQL отличается рядом конструкций, которые особенно полезны в аналитических запросах. На примерах можно разобраться с QUALIFY, оконными функциями, ARRAY, UNNEST, STRUCT и другими возможностями GoogleSQL.
Обновлено · Команда SQL Arena
Что потренируете
- Отбирать строки после оконных функций через QUALIFY
- Исключать служебные поля конструкцией SELECT * EXCEPT
- Разворачивать массивы через UNNEST и собирать ARRAY
- Работать со STRUCT и вложенными полями
- Практиковать BigQuery SQL в браузере без настройки облачного проекта
Пример задачи в тренажёре
Так выглядит задача в SQL Arena: условие, редактор, результат и схема базы.
В таблице customer_events хранится история действий клиентов. Для каждого клиента выведите его последнее событие: customer_id, event_type и event_time. Если событий несколько, нужна только самая поздняя строка. Отсортируйте результат по customer_id.
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_id | event_type | event_time |
|---|---|---|---|
| 1 | 1 | purchase | 2026-04-04 12:30:00 UTC |
| 2 | 2 | purchase | 2026-04-06 16:10:00 UTC |
| 3 | 3 | signup | 2026-04-03 11:20:00 UTC |
| 4 | 4 | trial | 2026-04-07 09:45:00 UTC |
В таблице customer_events хранится история действий клиентов. Для каждого клиента выведите его последнее событие: customer_id, event_type и event_time. Если событий несколько, нужна только самая поздняя строка. Отсортируйте результат по customer_id.
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;
Разбор 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 или внешнего подзапроса.
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_id | event_type | event_time |
|---|---|---|
| 1 | purchase | 2026-04-04 12:30:00 UTC |
| 2 | purchase | 2026-04-06 16:10:00 UTC |
| 3 | signup | 2026-04-03 11:20:00 UTC |
| 4 | trial | 2026-04-07 09:45:00 UTC |
| 5 | purchase | 2026-04-08 18:00:00 UTC |
Типичные ошибки в запросах BigQuery SQL
Пытаться фильтровать ROW_NUMBER через WHERE
WHERE применяется до вычисления оконных функций, поэтому условие по ROW_NUMBER() туда не подходит. В BigQuery для фильтрации результата окна есть QUALIFY.
Разворачивать ARRAY как обычную таблицу
Массив нельзя использовать так, будто каждый его элемент уже стал отдельной строкой. Для повторяющихся значений нужен UNNEST, после которого элементы можно фильтровать, соединять с другими данными и агрегировать.
Всегда писать 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 обращений. Отдельно можно включить режим «Собеседование»: он работает без подсказок, использует серверный таймер и после сессии показывает отчёт; одна попытка в день бесплатна.
- EasyбесплатноОблегчённый журнал событийbigquery
- EasyбесплатноПокупки без служебных деталейbigquery
- EasyбесплатноСессии без числа покупокbigquery
- EasyбесплатноДни недели в журналеbigquery
- MediumPremiumСобытия с кормом в корзинеbigquery
- MediumPremiumСколько разных колонистовbigquery
- MediumPremiumУзкий скан по регламентуbigquery
- MediumPremiumДве станции без ИЛИbigquery
Справочник по теме
Подробные статьи с синтаксисом и примерами в справочнике 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