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