Перейти к содержанию

Кейс с агрегациями (с дополнительным измерением «Разбивка»)

Настройка предварительно агрегированной аналитической витрины

Описание структуры данных

Метрики (показатели) представлены с учётом различных аналитических измерений. В данном примере для упрощения рассмотрено только измерение «Конкурент». Если значение в колонке «Конкурент» отсутствует, это означает, что данные относятся к общему показателю по компании.

Значения факта представлены для трёх типов периодов: месяц, квартал, год. Для всех периодов дата указана как первое число соответствующего периода. Например, дата "01.01.2024" с типом периода "год" соответствует показателям за весь 2024 год.

Агрегация данных на уровне витрины запрещена, так как данные уже предварительно консолидированы. Показатели должны извлекаться из соответствующих ячеек витрины данных в соответствии с параметрами пользовательского запроса. Данные витрины предварительно агрегированы по всем возможным комбинациям измерений, и любые дополнительные операции агрегирования (например, суммирование или усреднение) приводят к искажению аналитических результатов. Согласно методологии работы с витриной, такие операции над исходными данными запрещены. Формирование отчетности должно выполняться путем точечного извлечения единственного значения показателя из соответствующей ячейки витрины данных, которая определяется заданным набором измерений.

Метрика Конкурент Дата Тип периода Факт
Себестоимость чугуна Альянс 01.02.24 Месяц 22
Себестоимость чугуна Восход 01.02.24 Месяц 23
Себестоимость чугуна 01.02.24 Месяц 25
Себестоимость чугуна Альянс 01.04.24 Квартал
Себестоимость чугуна Восход 01.04.24 Квартал
Себестоимость чугуна 01.04.24 Квартал
Себестоимость чугуна Альянс 01.01.24 Год 52
Себестоимость чугуна Восход 01.01.24 Год 53
Себестоимость чугуна 01.01.24 Год 55

Задача

Бот должен выдать значение факта, для запрашиваемой метрики:

  • Если пользователь не указал измерение, бот выдает значение "Общее по компании".
  • Если пользователь не указал период, бот выдает последнее доступное значение факта.
  • Тип периода выбирается в зависимости от указанной в запросе даты.

Решение

На уровне витрины данных:

  • Добавить новое измерение "Разбивка", где хранится информация о том, что значение показателя соответствует общему по компании.

Итоговая таблица

Метрика Конкурент Дата Тип периода Факт Разбивка
Себестоимость чугуна Альянс 01.02.24 Месяц 22
Себестоимость чугуна Восход 01.02.24 Месяц 23
Себестоимость чугуна 01.02.24 Месяц 25 Общее по компании
Себестоимость чугуна Альянс 01.04.24 Квартал
Себестоимость чугуна Восход 01.04.24 Квартал
Себестоимость чугуна 01.04.24 Квартал Общее по компании
Себестоимость чугуна Альянс 01.01.24 Год 52
Себестоимость чугуна Восход 01.01.24 Год 53
Себестоимость чугуна 01.01.24 Год 55 Общее по компании

На уровне модели данных:

Сделать запрос для построения модели с сортировкой. Пример

SELECT *
FROM <название целевой таблицы>
ORDER BY Метрика,
         Тип периода,
         Дата DESC,
         Конкурент NULLS FIRST

Показатель Факт необходимо привязать к модели данных через расчетную колонку, используя SQL-выражение ANY("Факт"). Функция ANY выбирает первое значение из отсортированного массива данных. Порядок сортировки определяется согласно правилам, описанным выше.

На уровне сценариев диалога:

  • Дополнительные факты
Условие Текст
not hasValueDetailFact() Факт
not hasDateFilterFact() and not hasDateDetailFact() and not hasAttrDetailFact(Конкурент) Последний 1, добавь тип периода
not hasFact(Конкурент) Разбивка общее по компании
hasDateFilterFactWithFormat(quarter) and not hasDateDetailFact() тип периода квартал, поквартально
hasDateDetailFactWithFormat(month) тип периода месяц
hasDateDetailFactWithFormat(quarter) тип периода квартал
hasDateDetailFactWithFormat(year) тип периода год
hasDateFilterFactWithFormat(month) and not hasDateDetailFact() тип периода месяц, помесячно
hasDateFilterFactWithFormat(year) and not hasDateDetailFact() and not hasValueDetailFactWithDynamic() тип периода год, по годам
hasDateFilterFactWithFormat(year) and not hasDateDetailFact() and hasValueDetailFactWithDynamic() тип периода месяц, помесячно
  • Форма

Прописать форму, на случай если пользователь не указал метрику

Условие Условие шага Текст
hasFact(Факт) hasFact(Метрика) Пожалуйста, укажите метрику