Образ результата и декомпозиция
Вы уже умеете писать запросы разной сложности. Дальше — больше, и в следующих уроках вы научитесь работать с несколькими таблицами и объединять их данные.
Прежде чем перейти к новой теме, нужно разобраться с несколькими вещами, которые помогут быстрее понять, какой результат от вас требуют.
В этом уроке не будет кода и теории, но от этого он не менее важен. Попробуйте выделить самые полезные для себя советы и сформулировать план действий для решения сложных задач.
От бизнес-задачи к плану
Формулировать задачи можно по-разному. Например:
- Выгрузить три поля: фамилия покупателя, стоимость и дата покупки. Оставить только те записи, в которых указана информация о покупках с 1 по 15 января 2012 года.
- Оценить динамику продаж за первую половину января 2012 года.
Такие задачи вы умеете решать. Но обратите внимание, что первую задачу получится решить намного быстрее, ведь в формулировке есть всё, что нужно: какие поля выгрузить и за какой период.
Со второй задачей сложнее. Конкретные столбцы не указаны, да и к остальной формулировке много вопросов. Включает ли первая половина месяца пятнадцатое число? Как показать динамику? Что лучше отобразить: идентификатор покупателя или фамилию?
Первая формулировка больше напоминает учебное задание. Тренажёр, с которым вы работаете, проверяет результат, и если он не совпадает с «идеальным», то задачу решить не получится.
В реальности, конечно, не так. Запрос от бизнеса, техническое или тестовое задание чаще всего сформулированы в очень общем виде. Например, так: «построить отчёт изменения выручки», «отразить особенности продаж в первом полугодии» — или вообще в виде вопроса: «почему падают продажи?»
Специалисты в области SQL должны не только правильно писать запросы, но и понимать, чего хочет заказчик. Это творческая работа, и строгих правил тут нет.
Как превратить общую формулировку в конкретное описание? Вот несколько советов:
- Попробуйте представить итоговую таблицу, которая устроила бы заказчика. Такие гипотетические таблицы иначе называют образом конечного результата. Определите поля, которые войдут в эту таблицу, подумайте, какие агрегации и группировки стоит добавить.
- Выбирая поля для выгрузки, оцените, насколько ценными они будут для тех, кто получит итоговую таблицу. Например, можно указать идентификатор покупателя, но фамилия или адрес электронной почты будут полезнее, если результат понадобится для автоматической рассылки.
- Помните, что заказчик может быть далёк от мира аналитики. Результат должен быть понятен человеку, не знакомому с SQL или сложной математикой. Чтобы это проверить, покажите выгрузку вашему знакомому, несведущему в анализе данных. Если вам ответят, что всё понятно, поздравляем: заказчик, скорее всего, поймёт, что вы отобразили в отчёте.
- Задавайте вопросы. Если есть возможность, обсудите с заказчиком все детали. Так вам будет проще работать над задачей, а у заказчика возникнет меньше вопросов к результату.
- Позовите на помощь коллег. Пока вы новичок, просить коллег о помощи нормально. Не стесняйтесь советоваться с более опытными людьми.
- Если вы считаете, что каких-то данных не хватает, чтобы ответить на поставленный вопрос, обратитесь к заказчику. В большинстве случаев вам пойдут навстречу и передадут необходимые данные. Ведь в интересах заказчика получить от вас корректный результат.
Декомпозиция
Может показаться, что профессионалы умеют писать большие запросы сразу, с нуля. Однако это плохая стратегия.
Если вы попытаетесь написать большой код из десятков строк без подготовки, результат может быть неудовлетворительным. Одна из главных проблем — в большом коде практически невозможно определить, где происходит ошибка.
Чтобы избежать проблем, нужна декомпозиция — метод, который предполагает, что большую задачу дробят на несколько маленьких и более простых. Выполняя небольшие задачи, специалист в итоге собирает несколько решений в одно.
Допустим, вам нужно отобразить особенности продаж в первом полугодии 2018 года среди мужчин Московской области. Пошагово разберём, как решить такую задачу.
Сначала нужно представить гипотетическую итоговую таблицу. Обратимся к формулировке и разобьём её на части:
- «Отобразить особенности продаж…» — понадобится несколько метрик, например выручка, количество заказов и средняя выручка на один заказ. Чтобы показать динамику, можно отобразить метрики по месяцам или неделям. Тут пригодится группировка.
- «…в первом полугодии…» — это условие для среза. Однако увидеть отличия периода не получится, если не сравнивать его с другими. Выход: отобразить по одному полугодию до и после нужного периода.
- «…среди мужчин Московской области» — ещё одно условие для среза.
Теперь можно сформулировать задачу на языке, близком к SQL:
- Нужно отобразить на экране таблицу из четырёх полей: неделя заказа, выручка, количество заказов и средний чек.
- В итоговой таблице должны быть данные за период с 01.01.2018 по 31.05.2018.
- Результат нужно отфильтровать так: в поле
sexнужно отобрать значенияmen, а в полеcity— только населённые пункты Московской области.
Формулировка задачи готова. Теперь вместо одной задачи можно решить три маленьких:
- Сделать фильтр по полу и месту проживания и проверить работу такого запроса.
- Добавить фильтр по времени и проверить работу.
- Сгруппировать таблицу по неделям и посчитать метрики.
Обратите внимание, что так вы контролируете результат на каждом шаге. Если вы сразу получите ошибку, исправить её будет не так сложно, ведь вы ещё не успели написать много кода. Если же ошибка возникнет на последнем этапе, вы будете знать, что она появилась в результате группировки и итоговых подсчётов.
Подведём итоги и повторим преимущества декомпозиции:
- Проще найти ошибку, ведь вы сможете понять, на каком этапе она возникла.
- Вы не «утонете» в огромном коде, если будете писать его постепенно.
- Вы контролируете результат каждого шага и можете проверить итоговые данные на корректность.
Этот метод небезупречен. Например, если выгрузка платная, то выгружать результат на каждом этапе выполнения задачи может быть затратно. Однако пока у вас немного опыта, декомпозировать задачи полезно.