Вопросы на собеседовании: Analytics Engineer / Инженер аналитики
100 реальных вопросов с образцовыми ответами и пояснениями для уровня Junior.
Смотреть пример резюме: Analytics Engineer / Инженер аналитики →Тренировка флешкарточками
Интервальное повторение · Hunter Pass
Вопросы
Analytics Engineer превращает исходные данные из хранилища в проверенные и документированные модели, которыми можно пользоваться единообразно.
- Дата-инженеры обычно строят загрузку данных и платформенную инфраструктуру, которая доставляет данные в хранилище.
- Аналитики данных обычно интерпретируют подготовленные данные, отвечают на вопросы и создают отчёты.
- Analytics Engineer отвечает за слой моделирования между ними с помощью SQL, dbt, проверок, документации и контроля версий.
Зачем это спрашивают: Интервьюер проверяет, понимает ли кандидат ответственность за надёжный слой моделирования.
Многомерное моделирование организует аналитические данные вокруг измеримых бизнес-событий и их описательного контекста.
- Факты представляют события или процессы, например заказы, платежи или просмотры страниц.
- Измерения описывают сущности, например клиентов, товары, каналы и даты.
- Такая структура обеспечивает понятную и единообразную фильтрацию, группировку и агрегацию.
Зачем это спрашивают: Интервьюер оценивает, знает ли кандидат назначение и составные части многомерного моделирования.
Схема «звезда» размещает таблицу фактов в центре и напрямую соединяет её с таблицами измерений.
- Таблица фактов хранит строки с заявленной гранулярностью, меры и ключи измерений.
- Таблицы измерений содержат описательные атрибуты для фильтрации и группировки фактов.
- Простая структура соединений обычно понятна аналитикам и BI-инструментам.
Зачем это спрашивают: Интервьюер проверяет, может ли кандидат описать структуру и ценность схемы «звезда».
Схема «снежинка» нормализует измерения в связанные таблицы, а схема «звезда» хранит измерения в более денормализованном виде.
- «Снежинка» может уменьшить повторение атрибутов и явно представить иерархии.
- При этом появляется больше соединений, и потребителям сложнее ориентироваться в модели.
- «Звезда» обычно делает упор на простоту аналитики, а «снежинка» применяет нормализацию к отдельным измерениям.
Зачем это спрашивают: Интервьюер оценивает, понимает ли кандидат структурное различие и компромисс в удобстве использования.
Таблица фактов содержит бизнес-события или наблюдения за процессом с одной согласованной гранулярностью.
- Ключи измерений связывают событие с контекстом, например клиентом, товаром и датой.
- Меры хранят количество, выручку, длительность или остаток, когда это уместно.
- Идентификатор вроде номера заказа может остаться в таблице фактов, если для него нет описательного измерения.
Зачем это спрашивают: Интервьюер проверяет, умеет ли кандидат отличать факты от описательных атрибутов измерений.
Таблица измерений содержит описательные атрибуты, которые придают фактам бизнес-смысл.
- Измерение клиента может включать сегмент, страну, канал привлечения и статус.
- У измерения обычно есть ключ, на который ссылаются одна или несколько таблиц фактов.
- Его атрибуты дают названия, фильтры, группы и иерархии, а не меры событий.
Зачем это спрашивают: Интервьюер оценивает, понимает ли кандидат измерения как переиспользуемый аналитический контекст.
Гранулярность точно определяет, что представляет одна строка таблицы фактов.
- Например, это может быть одна строка на позицию заказа, состояние одного счёта за день или обращение в поддержку.
- Каждая мера и каждый ключ измерения должны быть корректны на этом же уровне детализации.
- Явная гранулярность не позволяет смешивать уровни, что приводит к дублированию и неверным агрегатам.
Зачем это спрашивают: Интервьюер проверяет, считает ли кандидат гранулярность основой надёжной модели фактов.
Мера является числовым свойством факта и считается аддитивной, если её сумма по подходящим измерениям сохраняет смысл.
- Количество товара и выручка по позиции обычно аддитивны по товарам, клиентам и датам.
- Остаток часто полуаддитивен, потому что его можно суммировать по счетам, но не по времени.
- Коэффициенты обычно неаддитивны, поэтому их лучше вычислять из исходных мер.
Зачем это спрашивают: Интервьюер оценивает, умеет ли кандидат определять, когда агрегация сохраняет бизнес-смысл.
Естественный ключ приходит из бизнес-домена исходной системы, а суррогатный ключ создаётся для аналитической модели.
- Email или идентификатор клиента в исходной системе может изменить значение или формат.
- Суррогатный ключ даёт хранилищу стабильный идентификатор, независимый от изменений источника.
- Суррогатные ключи поддерживают несколько исторических версий одного элемента измерения.
Зачем это спрашивают: Интервьюер проверяет, понимает ли кандидат причины разделения идентичности в источнике и хранилище.
Согласованное измерение является общим измерением с едиными ключами и определениями для нескольких таблиц фактов или процессов.
- Общее измерение клиента может использоваться для продаж и обращений в поддержку.
- Единые атрибуты обеспечивают одинаковый смысл фильтров и групп в разных отчётах.
- Согласованность позволяет сравнивать данные без повторного определения бизнес-понятий в каждой витрине данных.
Зачем это спрашивают: Интервьюер оценивает, понимает ли кандидат, как общие измерения обеспечивают согласованность доменов.
Измерение даты задаёт единый календарный словарь для анализа фактов во времени.
- Оно может содержать день, неделю, месяц, квартал, год, день недели и признак праздника.
- Финансовые периоды и специальные бизнес-календари можно определить один раз и переиспользовать.
- Факты соединяются с ним по ключу даты, чтобы отчёты применяли одинаковые временные группировки.
Зачем это спрашивают: Интервьюер проверяет, знает ли кандидат, почему календарную логику следует хранить в переиспользуемом измерении.
Транзакционная таблица фактов хранит по одной строке на бизнес-событие с минимальной полезной гранулярностью.
- Примерами служат позиция заказа, платёж, отправка или клик по товару.
- Обычно она содержит меры события и ключи измерений, актуальных в момент события.
- Атомарные факты дают гибкость, потому что потребители могут агрегировать их по-разному.
Зачем это спрашивают: Интервьюер оценивает, распознаёт ли кандидат шаблон фактов на уровне событий.
Периодическая таблица фактов-снимков фиксирует состояние процесса через регулярные интервалы.
- Одна строка может представлять дневной остаток по счёту или недельный запас товара.
- Её гранулярность включает наблюдаемую сущность и период снимка.
- Меры снимка часто полуаддитивны, потому что сумма повторяющихся состояний по времени вводит в заблуждение.
Зачем это спрашивают: Интервьюер проверяет, отличает ли кандидат наблюдения состояния от транзакций.
Накапливающая таблица фактов-снимков отслеживает один экземпляр процесса через несколько этапов.
- Строка может представлять заказ от создания до оплаты, отправки и доставки.
- Даты этапов и поля статуса обновляются по мере продвижения процесса.
- Её гранулярность составляет одну строку на экземпляр процесса, а не на этап.
Зачем это спрашивают: Интервьюер оценивает, понимает ли кандидат шаблон фактов для анализа жизненного цикла.
Тип 1 перезаписывает изменившийся атрибут, а тип 2 сохраняет историю, создавая новую версию строки.
- Type 1 подходит для исправлений или атрибутов, чьи прошлые значения не важны для анализа.
- Type 2 использует даты действия, признак текущей строки или похожие поля для определения версий.
- Факты могут ссылаться на суррогатный ключ, действовавший в момент события.
Зачем это спрашивают: Интервьюер проверяет, может ли кандидат объяснить историческое поведение обоих типов SCD.
Полезный логический порядок выглядит так: FROM и JOIN, WHERE, GROUP BY, HAVING, SELECT, DISTINCT, ORDER BY и LIMIT.
- FROM и JOIN формируют входные строки до фильтрации на уровне строк.
- GROUP BY создаёт группы, а HAVING фильтрует их до формирования результата.
- Оконные функции вычисляются после группировки и HAVING, но до окончательной сортировки результата.
- Псевдонимы из SELECT могут быть недоступны на более ранних логических этапах.
Зачем это спрашивают: Интервьюер оценивает, умеет ли кандидат рассуждать через логический порядок выполнения SQL.
WHERE фильтрует строки до агрегации, а HAVING фильтрует группы после неё.
- Условие по дате или статусу исходных строк обычно относится к WHERE.
- Условие вроде COUNT(*) больше десяти относится к HAVING.
- Фильтрация через WHERE меняет набор строк, участвующих в каждом агрегате.
Зачем это спрашивают: Интервьюер проверяет, правильно ли кандидат размещает условия уровня строк и агрегатов.
Для каждой выходной группы должно существовать одно однозначное значение каждого выбранного выражения без агрегации.
- GROUP BY определяет, какие входные строки сворачиваются в одну строку результата.
- Если выбранный столбец меняется внутри группы, вернуть одно значение невозможно.
- Явная группировка понятнее и переносимее, чем исключения отдельных диалектов.
Зачем это спрашивают: Интервьюер оценивает, понимает ли кандидат связь ключей группировки и результата агрегации.
Большинство SQL-агрегатов игнорирует NULL, а COUNT(*) считает строки независимо от наличия NULL.
- COUNT(column) считает только строки, где столбец не равен NULL.
- SUM(column) и AVG(column) используют значения без NULL и могут вернуть NULL, если таких значений нет.
- Замена NULL на ноль допустима только тогда, когда ноль имеет корректный бизнес-смысл.
Зачем это спрашивают: Интервьюер проверяет, может ли кандидат предсказать агрегаты без изменения смысла отсутствующих данных.
Раздувание строк при JOIN возникает, когда соединение создаёт несколько выходных строк для одной строки на уровне гранулярности меры.
- При соединении заказа с несколькими позициями столбцы уровня заказа повторяются для каждой позиции.
- Суммирование повторённой выручки затем завышает итог.
- Перед агрегацией нужно понимать кардинальность соединения и гранулярность обоих наборов.
Зачем это спрашивают: Интервьюер оценивает, распознаёт ли кандидат дублирование, вызванное соединениями.
Закрытые вопросы
- 21
Когда следует использовать INNER JOIN вместо LEFT JOIN?
joins - 22
Что такое общее табличное выражение, или CTE?
cte - 23
Чем оконная функция отличается от GROUP BY?
aggregationwindow-functions - 24
Что делают PARTITION BY и ORDER BY внутри оконной функции?
partitioningwindow-functions - 25
Чем отличаются ROW_NUMBER, RANK и DENSE_RANK?
window-functions - 26
Когда полезны LAG и LEAD?
window-functions - 27
Как вычислить накопительный итог с помощью оконной функции?
window-functions - 28
Что такое условная агрегация?
aggregation - 29
Как группировать даты по месяцам в аналитическом SQL?
sql - 30
Что делает COALESCE и когда его нужно применять осторожно?
queries - 31
Что такое модель dbt?
dbt - 32
Что делает ref в dbt?
dbt - 33
Что делает source в dbt?
dbt - 34
Зачем в проектах dbt используют staging-, intermediate- и mart-слои?
dbt - 35
Какие основные материализации есть в dbt?
dbt - 36
Что такое generic data tests в dbt?
genericsdbt - 37
Чем singular data test отличается от generic data test в dbt?
dbtgenerics - 38
Что должна описывать документация dbt?
documentationdbt - 39
Что такое lineage в dbt и как он формируется?
lineagedbt - 40
Что такое exposure в dbt?
dbt - 41
Что такое облачное хранилище данных?
warehouse - 42
Почему колоночное хранение полезно для аналитики?
schema - 43
Какие общие концепции есть у Snowflake, BigQuery и Redshift?
snowflakebigqueryredshift - 44
Чем ETL отличается от ELT?
etl - 45
Что такое витрина данных?
data-marts - 46
Что такое семантический слой?
semantic-layer - 47
Что такое слой метрик?
monitoring - 48
Почему аналитический код следует хранить в Git?
git - 49
Что должен содержать pull request с изменением аналитической модели?
code-review - 50
Какие базовые измерения качества данных должен знать Analytics Engineer?
quality - 51
Вы получили raw-таблицы orders и order_items. Как структурировать первые dbt-модели?
dbt - 52
Как смоделировать fact_orders для дашборда выручки?
- 53
Как построить customer dimension из CRM и данных пользователей приложения?
- 54
Raw product events содержат retries и duplicate event IDs. Как построить чистую events model?
- 55
Как смоделировать source freshness для ежедневных финансовых данных из Fivetran?
- 56
Join orders и payments удваивает revenue. Как исправить модель?
joins - 57
Как спроектировать star schema для дашборда продаж по product, customer и day?
schemamodelingdesign - 58
Customers могут относиться к нескольким marketing segments. Как смоделировать связь?
- 59
Как отслеживать изменения плана customer во времени через dbt?
dbt - 60
Дашборд должен показывать даты с нулём orders. Как смоделировать результат?
- 61
Как написать SQL для накопительной ежедневной revenue?
sql - 62
Как выбрать последнюю status row для каждого order?
- 63
Как вычислить семидневную moving average signups?
- 64
Как посчитать funnel signup-to-purchase из events table?
funnel - 65
Как построить monthly signup cohort retention table?
retentioncohorts - 66
Как сравнить purchase conversion по acquisition channel?
- 67
Как выделить sessions из web events без session ID?
sessions - 68
Как посчитать first-touch attribution из marketing events?
- 69
Как посчитать процент каждого product от monthly revenue?
- 70
Как дедуплицировать customer records, сохранив лучшую доступную строку?
queries - 71
Conversion rate становится null или бесконечным в малых группах. Как сделать SQL безопасным?
conversionsqlfundamentals - 72
Daily signups различаются между SQL в BigQuery и Looker dashboard. Как проверить timezone?
sqlbigquerybi - 73
Когда стоит сделать dbt-модель incremental вместо полной пересборки table?
dbt - 74
Как написать incremental filter для модели по updated_at?
- 75
Late-arriving events отсутствуют в incremental model. Как это исправить?
- 76
Incremental model создаёт duplicate orders после повторных запусков. Как это исправить?
- 77
В существующую incremental model нужно добавить новый source column. Как выпустить изменение?
schema - 78
Как выполнить backfill данных за год в incremental model без одного дорогого full refresh?
backfill - 79
Как проверить idempotency dbt-модели?
dbtidempotency - 80
Какие dbt tests стоит первыми добавить к новой fact_orders model?
dbt - 81
Relationships test между orders и customers падает. Как его отладить?
- 82
Source добавил новый order status, и accepted_values test падает. Что делать?
- 83
Как написать singular dbt test для net revenue?
dbt - 84
Source freshness check dbt падает перед утренним build. Как реагировать?
dbt - 85
Unique test падает только в CI. Как его отладить?
- 86
Как проверить, что сумма order остаётся в разумном диапазоне?
- 87
Как настроить GitHub Actions checks для dbt pull request?
ci-cddbtcode-review - 88
Два dashboards показывают разные значения одной conversion metric. Как их согласовать?
monitoring - 89
Finance считает dbt revenue выше total платёжного процессора. Как исследовать расхождение?
dbtconcurrency - 90
Fivetran сообщает о миллионе source rows, но staging model содержит меньше. Как найти разницу?
- 91
Funnel conversion резко падает после tracking release. Как его отладить?
funnel - 92
Monthly active users различаются между query к users table и events query. Как выбрать правильный расчёт?
queries - 93
Как открыть governed revenue metric в Looker или Lightdash?
monitoringbi - 94
Какую документацию добавить перед публикацией dbt model для analysts?
documentationdbt - 95
Как добавить dbt exposure для executive revenue dashboard?
dbt - 96
Pull request меняет общую customer model. Как оценить downstream impact?
code-review - 97
Что проверять при review pull request с dbt model?
code-reviewdbt - 98
Вы прототипировали metric в Hex через DuckDB. Как превратить её в production dbt model?
monitoringdbtprototypes - 99
API source изменил OpenAPI schema. Как безопасно обновить analytics models?
openapischema - 100
Как вывести из эксплуатации dbt model, у которой остаются downstream dashboards и notebooks?
dbt