200 likes | 596 Views
Нарастающие итоги в MDX. Фёдор Самородов. Фёдор Самородов. Fedor@Samorodov.ru http://Samorodov.SU. Нарастающий итог – классика отчётного жанра. Считаем нарастающий итог средствами MDX. Дано: Многомерная база данных Календарная размерность
E N D
Нарастающие итоги в MDX Фёдор Самородов
Фёдор Самородов • Fedor@Samorodov.ru • http://Samorodov.SU
Нарастающий итог – классика отчётного жанра
Считаем нарастающий итог средствами MDX Дано: • Многомерная база данных • Календарная размерность • Временная иерархия с нужной степенью гранулярности Требуется: • Просуммировать меру накопительным итогом • Результат представить в виде обыкновенного cellset’а
Стратегия решения задачи • Запускаем скользящее окно вдоль временной иерархии • Привязка к текущей временной отметке через CurrentMember • Суммируем факты, вырезанные скользящим окном
Метод № 1Простое скользящее окно • Нижняя граница окна фиксирована в «минус бесконечность» • NULL • Верхняя граница движется вдоль временной иерархии • Размерность.Иерархия.CurrentMember • Суммируем по диапазону между границами окна • Sum ({NULL:Размерность.Иерархия.CurrentMember}, …)
Метод № 2PeriodsToDate • Используем стандартное накопительное скользящее окно • PeriodsToDate () • Общий родитель – корневой элемент (верхний уровень) • Размерность.Иерархия.[Верхний уровень].Level • Размер окна растёт вдоль временной иерархии • Размерность.Иерархия.CurrentMember • Суммируем по скользящему окну • Sum (PeriodsToDate (…), …)
Метод № 3OpeningPeriod • Нижняя граница окна стоит на первой календарной отметке • OpeningPeriod (…, Размерность.Иерархия.[Верхний уровень]) • Верхняя граница движется вдоль временной иерархии • Размерность.Иерархия.CurrentMember • Суммируем по диапазону между границами окна • Sum ({OpeningPeriod (…):….CurrentMember}, …)
Метод № 4FirstChild • Нижняя граница окна стоит на первой календарной отметке • Размерность.Иерархия.CurrentMember.FirstChild • Верхняя граница движется вдоль временной иерархии • Размерность.Иерархия.CurrentMember • Суммируем по диапазону между границами окна • Sum (….FirstChild:….CurrentMember, …)
Метод № 5Item (0) • Нижняя граница окна стоит на первой календарной отметке • Размерность.Иерархия.CurrentMember.Level.Members.Item(0) • Верхняя граница движется вдоль временной иерархии • Размерность.Иерархия.CurrentMember • Суммируем по диапазону между границами окна • Sum (….Item (0):….CurrentMember, …)
Метод № 6Parent + Item • Нижняя граница окна стоит на первой календарной отметке • ….CurrentMember.Parent.Item(0).Item (1) • Верхняя граница движется вдоль временной иерархии • Размерность.Иерархия.CurrentMember • Суммируем по диапазону между границами окна • Sum (….Parent.Item(0).Item (1):….CurrentMember, …)
Новая стратегия решения • Не будем использовать скользящее окно • Перебираем элементы последовательно • Накапливаем итоговую сумму • Оформим рекурсию в секции WITH
Метод № 7Рекурсия • Якорь рекурсии • Если это первый элемент, берём его значение • Шаг рекурсии • Суммируем текущий элемент с накопленным итогом • Запоминаем накопленный итог
Ещё одна стратегия • Отранжируем множество по времени • Из отранжированного множества возьмём начало • Будем суммировать прошедший период
Метод № 8Ранжирование • Ранжируем все значения по времени • Rank (…) • Выделяем прошедший период • Head (…) • Суммируем прошедший период • Sum (Head (…))
Метод № 9Самый лучший метод • Работает быстрее всех предыдущих методов • Синтаксически – самый простой способ • Работает с любыми агрегатными функциями • в том числе с DistinctCount • Наилучший вариант для применения в реальных проектах
Трёхдневный курс по MDX-запросамв Специалисте • Specialist.ru/Course/M50578A • Один из разделов курса посвящён операциям над календарём: • Работа с измерением времени • Множественные календари • Расходящиеся горизонты • Вычисляемые временные члены и агрегаты • Периоды: параллельные, открывающие, закрывающие… • Сравнение по периодам, расчёт тенденций
В следующих серияхпро MDX-запросы • Полуаддитивные меры • Нестандартные агрегации • Проклятый DistinctCount!!! • Шаблоны и антишаблоны • Полезные приёмы для программирования индикаторов • Динамическое ограничение доступа • Существует ли «оптимизация MDX-запросов»? … и ещё много MDX-софткора и MDX-хардкора!