Нарастающие итоги в MDX Фёдор Самородов Фёдор Самородов • Fedor@Samorodov.ru • http://Samorodov.SU Страница 2 www.specialist.ru Нарастающий итог – классика отчётного жанра Страница 3 www.specialist.ru Считаем нарастающий итог средствами MDX Дано: Многомерная база данных Календарная размерность Временная иерархия с нужной степенью гранулярности Требуется: Просуммировать меру накопительным итогом Результат представить в виде обыкновенного cellset’а Страница 4 www.specialist.ru Стратегия решения задачи Запускаем скользящее окно вдоль временной иерархии Привязка к текущей временной отметке через CurrentMember Суммируем факты, вырезанные скользящим окном Страница 5 www.specialist.ru Метод № 1 Простое скользящее окно 1. Нижняя граница окна фиксирована в «минус бесконечность» – NULL 2. Верхняя граница движется вдоль временной иерархии – Размерность.Иерархия.CurrentMember 3. Суммируем по диапазону между границами окна – Страница 6 Sum ({NULL:Размерность.Иерархия.CurrentMember}, …) www.specialist.ru Метод № 2 PeriodsToDate 1. Используем стандартное накопительное скользящее окно – PeriodsToDate () 2. Общий родитель – корневой элемент (верхний уровень) – Размерность.Иерархия.[Верхний уровень].Level 3. Размер окна растёт вдоль временной иерархии – Размерность.Иерархия.CurrentMember 4. Суммируем по скользящему окну – Страница 7 Sum (PeriodsToDate (…), …) www.specialist.ru Метод № 3 OpeningPeriod 1. Нижняя граница окна стоит на первой календарной отметке – OpeningPeriod (…, Размерность.Иерархия.[Верхний уровень]) 2. Верхняя граница движется вдоль временной иерархии – Размерность.Иерархия.CurrentMember 3. Суммируем по диапазону между границами окна – Страница 8 Sum ({OpeningPeriod (…):….CurrentMember}, …) www.specialist.ru Метод № 4 FirstChild 1. Нижняя граница окна стоит на первой календарной отметке – Размерность.Иерархия.CurrentMember.FirstChild 2. Верхняя граница движется вдоль временной иерархии – Размерность.Иерархия.CurrentMember 3. Суммируем по диапазону между границами окна – Страница 9 Sum (….FirstChild:….CurrentMember, …) www.specialist.ru Метод № 5 Item (0) 1. Нижняя граница окна стоит на первой календарной отметке – Размерность.Иерархия.CurrentMember.Level.Members.Item (0) 2. Верхняя граница движется вдоль временной иерархии – Размерность.Иерархия.CurrentMember 3. Суммируем по диапазону между границами окна – Страница 10 Sum (….Item (0):….CurrentMember, …) www.specialist.ru Метод № 6 Parent + Item 1. Нижняя граница окна стоит на первой календарной отметке – ….CurrentMember.Parent.Item (0).Item (1) 2. Верхняя граница движется вдоль временной иерархии – Размерность.Иерархия.CurrentMember 3. Суммируем по диапазону между границами окна – Страница 11 Sum (….Parent.Item (0).Item (1):….CurrentMember, …) www.specialist.ru Новая стратегия решения Не будем использовать скользящее окно Перебираем элементы последовательно Накапливаем итоговую сумму Оформим рекурсию в секции WITH Страница 12 www.specialist.ru Метод № 7 Рекурсия Якорь рекурсии – Если это первый элемент, берём его значение Шаг рекурсии – Суммируем текущий элемент с накопленным итогом – Запоминаем накопленный итог Страница 13 www.specialist.ru Ещё одна стратегия Отранжируем множество по времени Из отранжированного множества возьмём начало Будем суммировать прошедший период Страница 14 www.specialist.ru Метод № 8 Ранжирование Ранжируем все значения по времени – Rank (…) Выделяем прошедший период – Head (…) Суммируем прошедший период – Sum (Head (…)) Страница 15 www.specialist.ru Производительность Метод Страница 16 Время выполнения (18485 строк, Sum (), int) 1 «Метод №9» 0:02 2 OpeningPeriod 3:55 3 Parent + Item 4:05 4 Простое скользящее окно 4:12 5 FirstChild 4:20 6 Item (0) 4:25 7 PeriodsToDate 4:29 8 Рекурсия 6:01 9 Ранжирование 11:29 www.specialist.ru Метод № 9 Самый лучший метод Работает быстрее всех предыдущих методов Синтаксически – самый простой способ Работает с любыми агрегатными функциями – в том числе с DistinctCount Наилучший вариант для применения в реальных проектах Страница 17 www.specialist.ru Трёхдневный курс по MDX-запросам в Специалисте Specialist.ru/Course/M50578A Один из разделов курса посвящён операциям над календарём: – Работа с измерением времени – Множественные календари – Расходящиеся горизонты – Вычисляемые временные члены и агрегаты – Периоды: параллельные, открывающие, закрывающие… – Сравнение по периодам, расчёт тенденций Страница 18 www.specialist.ru В следующих сериях про MDX-запросы Полуаддитивные меры Нестандартные агрегации Проклятый DistinctCount!!! Шаблоны и антишаблоны Полезные приёмы для программирования индикаторов Динамическое ограничение доступа Существует ли «оптимизация MDX-запросов»? … и ещё много MDX-софткора и MDX-хардкора! Страница 19 www.specialist.ru