Нарастающий итог в MDX

advertisement
Нарастающие итоги в 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
Download