Бран · продюсер «Хроник Пограничья»
Дашборд классный, но мне всё время нужно «то же самое, только Android» или «только после релиза». Каждый раз писать тебе? Сделай так, чтобы я сам переключал.
В прошлом уроке мы собрали дашборд из четырёх карточек. Каждая отвечает на свой вопрос, но за весь период и по всем платформам сразу. Сегодня добавим два переключателя, которые действуют на всю страницу: период и платформу.
Пульт от всех телевизоров сразу
Представь гостиницу, где в каждом номере свой телевизор и свой пульт. Чтобы во всех номерах переключить канал, надо обойти все номера. А теперь представь один пульт на ресепшене, который переключает все телевизоры разом. Это и есть параметр дашборда: читатель выбирает значение один раз, и все карточки пересчитываются от него.
Так читатель не может случайно сравнить выручку за май с DAU за июнь. Все числа на странице всегда про один и тот же срез.
Как параметр попадает в запрос
В нашем мини-DataLens параметр пишется в SQL как $имя. Для платформы это $platform. Период задаётся двумя датами, поэтому параметр period даёт два имени: $period_from и $period_to.
SELECT started_at::date AS day, count(DISTINCT player_id) AS dau
FROM sessions
WHERE ($platform = 'все' OR platform = $platform)
AND started_at >= $period_from::date
AND started_at < $period_to::date + 1
GROUP BY day
ORDER BY day;
Три детали, на которых держится вся карточка.
Значение «все». У селектора платформы есть пункт «все». Условие $platform = 'все' OR platform = $platform при «все» пропускает любые строки, а при «android» только Android. Без первой половины выбор «все» вернул бы пустую карточку: платформы с таким названием нет.
Типы. Значение параметра приходит текстом, поэтому дату приводим явно: $period_from::date. Иначе база будет сравнивать дату со строкой по своим правилам.
Последний день. Период «с 14 по 20 мая» включает 20 мая целиком. started_at это момент времени, а $period_to::date это полночь в начале 20 мая. Поэтому правая граница строгая и на день позже: < $period_to::date + 1. Такой полуоткрытый интервал для моментов времени надёжнее BETWEEN.
Параметризованный запрос подставляет значения не склейкой строк. Дашборд меняет $platform на метку $1 и передаёт «android» в базу отдельно. Даже если в селекторе окажется что-то вроде '; DELETE FROM players; --, база увидит это как обычную строку и ничего не найдёт.
Ошибка аналитика
урок из курса
Урок из курса «Аналитика данных с нуля». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.