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

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

  • Upload
    kosey

  • View
    133

  • Download
    0

Embed Size (px)

DESCRIPTION

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

Citation preview

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

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

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

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

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

[email protected]• http://Samorodov.SU

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

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

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

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

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

Считаем нарастающий итог средствами MDX

Дано: Многомерная база данных

Календарная размерность

Временная иерархия с нужной степенью гранулярности

Требуется: Просуммировать меру накопительным итогом

Результат представить в виде обыкновенного cellset’а

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

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

Стратегия решения задачи

Запускаем скользящее окно вдоль временной иерархии

Привязка к текущей временной отметке через CurrentMember

Суммируем факты, вырезанные скользящим окном

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

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

Метод № 1Простое скользящее окно

1. Нижняя граница окна фиксирована в «минус бесконечность»– NULL

2. Верхняя граница движется вдоль временной иерархии– Размерность.Иерархия.CurrentMember

3. Суммируем по диапазону между границами окна– Sum ({NULL:Размерность.Иерархия.CurrentMember}, …)

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

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

Метод № 2PeriodsToDate

1. Используем стандартное накопительное скользящее окно– PeriodsToDate ()

2. Общий родитель – корневой элемент (верхний уровень)– Размерность.Иерархия.[Верхний уровень].Level

3. Размер окна растёт вдоль временной иерархии– Размерность.Иерархия.CurrentMember

4. Суммируем по скользящему окну– Sum (PeriodsToDate (…), …)

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

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

Метод № 3OpeningPeriod

1. Нижняя граница окна стоит на первой календарной отметке– OpeningPeriod (…, Размерность.Иерархия.[Верхний уровень])

2. Верхняя граница движется вдоль временной иерархии– Размерность.Иерархия.CurrentMember

3. Суммируем по диапазону между границами окна– Sum ({OpeningPeriod (…):….CurrentMember}, …)

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

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

Метод № 4FirstChild

1. Нижняя граница окна стоит на первой календарной отметке– Размерность.Иерархия.CurrentMember.FirstChild

2. Верхняя граница движется вдоль временной иерархии– Размерность.Иерархия.CurrentMember

3. Суммируем по диапазону между границами окна– Sum (….FirstChild:….CurrentMember, …)

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

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

Метод № 5Item (0)

1. Нижняя граница окна стоит на первой календарной отметке– Размерность.Иерархия.CurrentMember.Level.Members.Item (0)

2. Верхняя граница движется вдоль временной иерархии– Размерность.Иерархия.CurrentMember

3. Суммируем по диапазону между границами окна– Sum (….Item (0):….CurrentMember, …)

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

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

Метод № 6Parent + Item

1. Нижняя граница окна стоит на первой календарной отметке– ….CurrentMember.Parent.Item (0).Item (1)

2. Верхняя граница движется вдоль временной иерархии– Размерность.Иерархия.CurrentMember

3. Суммируем по диапазону между границами окна– Sum (….Parent.Item (0).Item (1):….CurrentMember, …)

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

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

Новая стратегия решения

Не будем использовать скользящее окно

Перебираем элементы последовательно

Накапливаем итоговую сумму

Оформим рекурсию в секции WITH

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

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

Метод № 7Рекурсия

Якорь рекурсии– Если это первый элемент, берём его значение

Шаг рекурсии– Суммируем текущий элемент с накопленным итогом

– Запоминаем накопленный итог

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

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

Ещё одна стратегия

Отранжируем множество по времени

Из отранжированного множества возьмём начало

Будем суммировать прошедший период

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

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

Метод № 8Ранжирование

Ранжируем все значения по времени– Rank (…)

Выделяем прошедший период– Head (…)

Суммируем прошедший период– Sum (Head (…))

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

Страница 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

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

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

Метод № 9Самый лучший метод

Работает быстрее всех предыдущих методов

Синтаксически – самый простой способ

Работает с любыми агрегатными функциями – в том числе с DistinctCount

Наилучший вариант для применения в реальных проектах

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

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

Трёхдневный курс по MDX-запросамв Специалисте

Specialist.ru/Course/M50578A

Один из разделов курса посвящён операциям над календарём:– Работа с измерением времени

– Множественные календари

– Расходящиеся горизонты

– Вычисляемые временные члены и агрегаты

– Периоды: параллельные, открывающие, закрывающие…

– Сравнение по периодам, расчёт тенденций

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

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

В следующих сериях про MDX-запросы

Полуаддитивные меры

Нестандартные агрегации

Проклятый DistinctCount!!!

Шаблоны и антишаблоны

Полезные приёмы для программирования индикаторов

Динамическое ограничение доступа

Существует ли «оптимизация MDX-запросов»?

… и ещё много MDX-софткора и MDX-хардкора!