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

Пользовательские меры (SQL и агрегация)

Введение

В Planiqum поддерживается создание вычисляемых мер — мер, значения которых рассчитываются автоматически на основе заданной конфигурации. Это позволяет создавать сложные метрики без необходимости хранения дополнительных данных в таблицах фактов.

Типы параметров с вычисляемыми мерами

Вычисляемые меры можно использовать в двух сценариях:

  1. Добавление в существующий параметр с обычными мерами:
  2. Вычисляемая мера добавляется к уже существующим мерам параметра
  3. Колонка для вычисляемой меры не создается в таблице фактов
  4. Значения рассчитываются динамически при запросе данных

  5. Создание нового параметра только с вычисляемыми мерами:

  6. Параметр содержит только вычисляемые меры
  7. Таблица фактов для параметра не создается
  8. Все данные получаются через SQL-запросы или агрегацию

Типы вычисляемых мер

1. SQL-запрос

Позволяет создать меру на основе произвольного SQL-запроса.

Настройки: - Метод расчёта: SQL-запрос - SQL: Текст SQL-запроса, который должен возвращать данные в формате таблицы фактов

Важно: SQL-запрос должен возвращать результат в том же формате, что и таблица фактов параметра: - dim-колонки для всех измерений параметра (например, dim_product_id, dim_month_id) - m-колонки для всех мер параметра (например, m_quantity, m_amount)

Пример SQL-запроса для параметра с измерениями "Товар" и "Месяц":

SELECT 
    dim_product_id,
    dim_month_id,
    SUM(fact_sales.m_quantity * conversion_factors.factor) as m_calculated_quantity,
    SUM(fact_sales.m_amount) as m_total_amount
FROM fact_sales 
JOIN conversion_factors ON fact_sales.dim_product_id = conversion_factors.product_id
GROUP BY dim_product_id, dim_month_id

Структура SQL-запроса для вычисляемых мер:

  1. dim-колонки: Должны присутствовать все измерения параметра
  2. dim_product_id — измерение "Товар"
  3. dim_month_id — измерение "Месяц"
  4. dim_warehouse_id — измерение "Склад" (если есть)

  5. m-колонки: Должны присутствовать все меры параметра

  6. m_quantity — мера "Количество"
  7. m_amount — мера "Сумма"
  8. m_calculated_quantity — вычисляемая мера

  9. GROUP BY: Должен включать все dim-колонки для правильной группировки

2. Пользовательская агрегация

Позволяет создать меру на основе агрегации данных с использованием различных функций.

Настройки: - Метод расчёта: Пользовательская агрегация - Конфигурация расчёта: JSON с параметрами агрегации

Поддерживаемые функции агрегации:

Календарная агрегация (для функций first и last): - first — первое значение в периоде (например, запасы на начало недели) - last — последнее значение в периоде (например, запасы на конец недели)

Скользящая агрегация (для функций sum, avg, min, max): - sum — сумма значений за диапазон периодов - avg — среднее значение за диапазон периодов - min — минимальное значение за диапазон периодов - max — максимальное значение за диапазон периодов

Пример конфигурации для скользящей агрегации:

{
    "agg_func": "sum",
    "source_parameter": "sales",
    "source_measure": "quantity"
}

Пример конфигурации для календарной агрегации:

{
    "agg_func": "last",
    "source_measure": "qty"
}

Важно: Для календарной агрегации (first/last) указывается только source_measure - ключ меры в исходном параметре. Система автоматически определяет исходный параметр по соотношению календарных измерений.

Соотношение измерений в календарной агрегации

При использовании календарной агрегации (first/last) система автоматически определяет соотношение между измерениями календаря:

  1. Исходный параметр должен содержать измерение календаря с более детальным уровнем (например, day)
  2. Целевой параметр должен содержать измерение календаря с более общим уровнем (например, week или month)
  3. Система автоматически находит соответствие между уровнями календаря и выбирает нужные значения

Требования: - Календарные измерения должны быть родственными (один уровень должен быть предком другого) - Остальные измерения (не календарные) должны совпадать по типу между параметрами

Создание вычисляемой меры

Выбор сценария

Перед созданием вычисляемой меры определите подходящий сценарий:

  • Для расширения существующего параметра: Добавьте вычисляемую меру к параметру, который уже содержит обычные меры
  • Для создания нового параметра: Создайте новый параметр и добавьте в него только вычисляемые меры

Через административную панель

  1. Перейдите в раздел "Параметры" → "Меры"
  2. Нажмите "Добавить меру"
  3. Заполните основные поля:
  4. Ключ: Уникальный идентификатор меры
  5. Параметр: Параметр, к которому привязана мера (существующий или новый)
  6. Имя: Отображаемое название меры
  7. Описание: Описание назначения меры

  8. Настройте вычисляемую меру:

  9. Вычисляемая мера: Установите галочку
  10. Метод расчёта: Выберите тип вычисления
  11. Конфигурация расчёта: Заполните JSON-конфигурацию (для пользовательской агрегации)
  12. SQL: Введите SQL-запрос (для SQL-запросов)

  13. Сохраните меру

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

Через код

from planiqum.core.parameters.models import Measure, Parameter

# Создание меры с SQL-запросом
measure = Measure.objects.create(
    key='custom_sql_measure',
    parameter=parameter,
    shortname='Вычисляемая мера',
    description='Мера на основе SQL-запроса',
    is_calculated=True,
    calculation_method='raw_sql',
    raw_sql='SELECT SUM(m_qty) FROM fact_sales WHERE dim_month_id = 202401'
)

# Создание меры с пользовательской агрегацией
measure = Measure.objects.create(
    key='custom_agg_measure',
    parameter=parameter,
    shortname='Агрегированная мера',
    description='Мера на основе агрегации',
    is_calculated=True,
    calculation_method='custom_agg',
    calculation_config={
        'agg_func': 'sum',
        'source_parameter': 'sales',
        'source_measure': 'quantity'
    }
)

Использование в отчётах

Вычисляемые меры используются в отчётах так же, как обычные меры:

  1. Создайте отчёт в дашборде
  2. Добавьте слой данных и выберите вычисляемую меру
  3. Настройте измерения и фильтры
  4. Сохраните отчёт

Система автоматически выполнит расчёт значений для вычисляемой меры при загрузке данных отчёта.

Ограничения и особенности

SQL-запросы

  • Структура результата: SQL-запрос должен возвращать данные в формате таблицы фактов с dim-колонками для измерений и m-колонками для мер
  • Безопасность: SQL-запросы выполняются в контексте базы данных с ограниченными правами
  • Производительность: Сложные запросы могут влиять на скорость загрузки отчётов
  • Совместимость: Запросы должны быть совместимы с используемой СУБД (PostgreSQL/MySQL)

Пользовательская агрегация

  • Доступность данных: Агрегация работает только с существующими данными в системе
  • Производительность: Для больших объёмов данных может потребоваться оптимизация
  • Кэширование: Результаты агрегации могут кэшироваться для улучшения производительности

Календарная агрегация (first/last): - Соотношение измерений: Календарные измерения должны быть родственными (один уровень должен быть предком другого) - Автоматическое определение: Система автоматически находит исходный параметр по соотношению календарных измерений - Ограничение: Работает только с календарными измерениями

Скользящая агрегация (sum/avg/min/max): - Диапазон периодов: Требует указания offset_from и offset_to для определения диапазона агрегации - Поддержка ключей: Поддерживает как числовые сдвиги, так и ключи уровней (например, horizon__month) - Ограничение: Не поддерживает два ключа периода одновременно

Синхронизация параметров

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

Подробнее о синхронизации: См. Синхронизация параметров — как работает синхронизация для разных типов параметров и мер.

Примеры использования

Пример 1: Расчёт среднего чека

Цель: Создать меру "Средний чек" на основе данных о продажах.

SQL-запрос для параметра с измерениями "Товар" и "Месяц":

SELECT 
    dim_product_id,
    dim_month_id,
    CASE 
        WHEN SUM(m_quantity) > 0 
        THEN SUM(m_amount) / SUM(m_quantity)
        ELSE 0 
    END as m_avg_check
FROM fact_sales 
GROUP BY dim_product_id, dim_month_id

Пример 2: Агрегация запасов по периодам

Сценарий: У вас есть параметр stock_history_daily с измерениями "item" и "day", мера "qty" содержит запасы по дням. Нужно создать агрегированные параметры по неделям и месяцам.

Вариант 2.1: Запасы на конец недели

Цель: Создать параметр stock_history_weekly с измерениями "item" и "week", где мера "qty" содержит запасы на последний день недели.

Шаги: 1. Создайте параметр stock_history_weekly с измерениями: - item (тот же тип, что и в исходном параметре) - week (календарное измерение, уровень недели)

  1. Создайте вычисляемую меру в параметре stock_history_weekly:
  2. Ключ: qty
  3. Метод расчёта: Пользовательская агрегация
  4. Конфигурация:
    {
        "agg_func": "last",
        "source_measure": "qty"
    }
    

Результат: Система автоматически найдёт соответствие между днями и неделями, выбрав запасы на последний день каждой недели.

Вариант 2.2: Запасы на конец месяца

Цель: Создать параметр stock_history_monthly с измерениями "item" и "month", где мера "qty" содержит запасы на последний день месяца.

Шаги: 1. Создайте параметр stock_history_monthly с измерениями: - item (тот же тип, что и в исходном параметре) - month (календарное измерение, уровень месяца)

  1. Создайте вычисляемую меру в параметре stock_history_monthly:
  2. Ключ: qty
  3. Метод расчёта: Пользовательская агрегация
  4. Конфигурация:
    {
        "agg_func": "last",
        "source_measure": "qty"
    }
    

Результат: Система автоматически найдёт соответствие между днями и месяцами, выбрав запасы на последний день каждого месяца.

Пример 3: Запасы на начало периода

Цель: Создать параметр с запасами на начало недели/месяца.

Конфигурация агрегации:

{
    "agg_func": "first",
    "source_measure": "qty"
}

Результат: Система выберет запасы на первый день каждого периода.

Пример 4: Расчёт конверсии

Цель: Создать меру "Конверсия" (отношение продаж к заявкам).

SQL-запрос для параметра с измерениями "Товар" и "Месяц":

SELECT 
    dim_product_id,
    dim_month_id,
    CASE 
        WHEN SUM(fact_requests.m_quantity) > 0 
        THEN (SUM(fact_sales.m_quantity) * 100.0 / SUM(fact_requests.m_quantity))
        ELSE 0 
    END as m_conversion_rate
FROM fact_requests
LEFT JOIN fact_sales ON fact_requests.dim_product_id = fact_sales.dim_product_id 
    AND fact_requests.dim_month_id = fact_sales.dim_month_id
GROUP BY dim_product_id, dim_month_id

Отладка и мониторинг

Проверка SQL-запросов

  1. Тестирование в базе данных: Выполните SQL-запрос напрямую в базе данных для проверки синтаксиса
  2. Логирование: Проверьте логи приложения на наличие ошибок выполнения
  3. Производительность: Используйте EXPLAIN для анализа плана выполнения запроса

Мониторинг производительности

  • Время выполнения: Отслеживайте время загрузки отчётов с вычисляемыми мерами
  • Использование ресурсов: Мониторьте нагрузку на базу данных
  • Кэширование: Настройте кэширование для часто используемых вычислений

Рекомендации

Проектирование вычисляемых мер

  1. Простота: Старайтесь создавать простые и понятные вычисления
  2. Производительность: Оптимизируйте SQL-запросы для больших объёмов данных
  3. Документирование: Всегда добавляйте описание к вычисляемым мерам
  4. Тестирование: Проверяйте корректность вычислений на тестовых данных

Безопасность

  1. Валидация: Проверяйте SQL-запросы на безопасность
  2. Права доступа: Ограничивайте доступ к созданию вычисляемых мер
  3. Аудит: Ведите журнал создания и изменения вычисляемых мер

Связанные разделы: - Параметры: введение - Меры - Отчёты - Базовые понятия