Раздел 42 · Аналитика данных с нуля

Чарты: измерения и меры

middle~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Бран · продюсер «Хроник Пограничья»

Хочу на стену два графика: выручку по месяцам и какие классы выбирают на каких платформах. Геймдизайнеры говорят, маги это «айфонный» класс. Правда?

В прошлом уроке мы выбирали форму графика под вопрос. Теперь соберём график из запроса: поймём, какая колонка уходит на ось, какая становится высотой столбца, а какая цветом.

Измерения и меры

Любой график из запроса держится на двух видах колонок.

Измерение отвечает на «по чему режем»: месяц, класс, платформа. В SQL это то, что стоит в GROUP BY. Мера отвечает на «что считаем»: выручку, число персонажей, средний чек. В SQL это агрегат: sum, count, avg.

Во вкладке «График» песочницы это три поля: «Ось X» это первое измерение, «Меры» это одна или несколько числовых колонок, «Разбивка цветом» это второе измерение, если оно есть.

Линия: выручка по месяцам

Одно измерение (месяц) и одна мера (выручка). Выручку берём чистую, как в боссе Пограничья: только оплаченные покупки, без тестовых аккаунтов и без повторов одного чека.

WITH clean AS (
  SELECT p.*
  FROM purchases p
  JOIN players pl ON pl.id = p.player_id
  WHERE p.status = 'paid'
    AND pl.email NOT LIKE '%@studio.dev'
    AND p.id IN (SELECT min(id) FROM purchases GROUP BY receipt_id)
)
SELECT date_trunc('month', created_at)::date AS month,
       sum(amount_rub) AS revenue
FROM clean
GROUP BY month
ORDER BY month;
   month    | revenue
------------+-----------
 2026-01-01 |  55387.00
 2026-02-01 |  62880.00
 2026-03-01 | 162521.00
 2026-04-01 | 183764.00
 2026-05-01 | 122640.00
 2026-06-01 |  70564.00

На линии видно гору: рост в марте, пик в апреле и спад после релиза 2.0 в мае и июне. Точки идут в порядке ORDER BY month. График не сортирует сам: если убрать ORDER BY, месяцы могут встать вразнобой.

Столбцы с разбивкой: классы по платформам

Теперь два измерения: класс и платформа. Запрос возвращает их в длинном формате, по строке на пару «класс, платформа»:

SELECT c.class, p.platform, count(*) AS characters
FROM characters c
JOIN players p ON p.id = c.player_id
GROUP BY c.class, p.platform
ORDER BY c.class, p.platform;
  class  | platform | characters
---------+----------+------------
 mage    | android  |        644
 mage    | ios      |        372
 mage    | pc       |        262
 priest  | android  |        405
 ...
 warrior | pc       |        293

Во вкладке «График» ставим «Ось X» = class, «Меры» = characters, «Разбивка цветом» = platform. Песочница сама разложит строки по сериям: у каждого класса три столбца, по цвету на платформу. Повторы одной пары «категория, серия» график суммирует, поэтому запрос лучше сразу группировать до нужного уровня.

То же можно получить в широком формате: count(*) FILTER (WHERE p.platform = 'ios') AS ios и так далее, а в «Мерах» отметить три колонки. Для графика оба варианта равноценны. Длинный удобнее, когда значений второго измерения много или они заранее неизвестны.

урок из курса

Урок из курса «Аналитика данных с нуля». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.