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

Preview:

DESCRIPTION

Нарастающие итоги в MDX. Фёдор Самородов. Фёдор Самородов. Fedor@Samorodov.ru http://Samorodov.SU. Нарастающий итог – классика отчётного жанра. Считаем нарастающий итог средствами MDX. Дано: Многомерная база данных Календарная размерность - PowerPoint PPT Presentation

Citation preview

Нарастающие итоги в MDXФёдор Самородов

Страница 2 www.specialist.ru

Фёдор Самородов

• Fedor@Samorodov.ru• http://Samorodov.SU

Страница 3 www.specialist.ru

Нарастающий итог – классика отчётного жанра

Страница 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-хардкора!

Recommended