Нарастающий итог в MDX
Download
Report
Transcript Нарастающий итог в MDX
Нарастающие итоги в MDX
Фёдор Самородов
Фёдор Самородов
• [email protected]
• 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