Кейс с агрегациями (с дополнительным измерением «Разбивка»)¶
Настройка предварительно агрегированной аналитической витрины¶
Описание структуры данных¶
Метрики (показатели) представлены с учётом различных аналитических измерений. В данном примере для упрощения рассмотрено только измерение «Конкурент». Если значение в колонке «Конкурент» отсутствует, это означает, что данные относятся к общему показателю по компании.
Значения факта представлены для трёх типов периодов: месяц, квартал, год. Для всех периодов дата указана как первое число соответствующего периода. Например, дата "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(Метрика) | Пожалуйста, укажите метрику |