Урок 2.3: Работа с наборами и членами

Урок 2.3: Работа с наборами и членами

Модуль 2: Основы синтаксиса MDX

Введение: Основа многомерной модели данных

Добро пожаловать в третий урок модуля синтаксиса MDX! В предыдущих уроках мы научились писать базовые запросы и работать со срезами через WHERE. Сегодня мы глубоко изучим фундаментальные концепции MDX - наборы (Sets) и члены (Members). Эти понятия являются строительными блоками любого MDX-запроса, и их правильное понимание критически важно для эффективной работы с многомерными данными.

Если представить куб данных как библиотеку, то члены - это конкретные книги, а наборы - это полки или коллекции книг. Умение правильно формировать и манипулировать наборами определяет вашу способность извлекать нужную информацию из куба.

Теоретические основы: Что такое член в MDX

Член (Member) - это атомарная единица в иерархии измерения. Каждый член представляет конкретное значение в измерении и имеет уникальный идентификатор в пределах куба. Члены организованы в иерархическую структуру, где каждый член (кроме корневого) имеет родителя и может иметь потомков.

Типы членов

В MDX существует несколько типов членов:

  • Обычные члены - это физические члены, хранящиеся в кубе. Например, [Product].[Category].[Bikes] - это обычный член, представляющий категорию велосипедов.
  • Вычисляемые члены - создаются динамически через MDX-выражения. Они не хранятся физически в кубе, а вычисляются при выполнении запроса.
  • Член All - специальный агрегирующий член, обычно находящийся на вершине иерархии. Представляет совокупность всех членов нижележащих уровней.

Уникальная идентификация членов

Каждый член имеет несколько способов идентификации:

Уникальное имя (Unique Name)

Полный путь к члену в иерархии:

[Product].[Product Categories].[Category].[Bikes]

Ключ члена (Member Key)

Внутренний идентификатор, используемый для более эффективного доступа:

[Product].[Category].&[1]

Имя члена (Member Name)

Отображаемое имя, которое может быть неуникальным:

[Product].[Category].[Bikes]

Наборы: Коллекции членов

Набор (Set) в MDX - это упорядоченная коллекция кортежей. В простейшем случае, когда кортежи состоят из одного члена, набор представляет собой упорядоченную коллекцию членов. Наборы являются основой для определения осей в MDX-запросах.

Характеристики наборов

  • Упорядоченность - порядок элементов в наборе имеет значение и сохраняется. {A, B, C} отличается от {C, B, A}.
  • Уникальность - MDX автоматически удаляет дубликаты из наборов. Если член появляется в наборе несколько раз, он будет представлен только один раз.
  • Размерность - все кортежи в наборе должны иметь одинаковую размерность (состоять из членов одних и тех же измерений).

Способы создания наборов

MDX предоставляет множество способов создания наборов:

Явное перечисление в фигурных скобках:

{[Product].[Category].[Bikes], 
 [Product].[Category].[Clothing], 
 [Product].[Category].[Accessories]}

Использование функций:

[Product].[Category].Members  -- Все члены уровня Category

Создание диапазонов:

[Date].[Calendar Year].&[2011]:[Date].[Calendar Year].&[2013]

Свойства и функции членов

Каждый член имеет набор встроенных свойств, доступных через различные функции:

Навигационные свойства

Parent - возвращает родительский член:

[Product].[Product Categories].[Subcategory].[Mountain Bikes].Parent
-- Вернёт [Product].[Product Categories].[Category].[Bikes]

Children - возвращает набор дочерних членов:

[Product].[Product Categories].[Category].[Bikes].Children
-- Вернёт все подкатегории велосипедов

Siblings - возвращает членов того же уровня с тем же родителем:

[Product].[Product Categories].[Category].[Bikes].Siblings
-- Вернёт все категории продуктов

Информационные свойства

Name - возвращает имя члена:

[Product].[Category].[Bikes].Name  -- Вернёт "Bikes"

UniqueName - возвращает уникальное имя члена:

[Product].[Category].[Bikes].UniqueName
-- Вернёт "[Product].[Category].[Bikes]"

Level - возвращает уровень, которому принадлежит член:

[Product].[Product Categories].[Subcategory].[Mountain Bikes].Level
-- Вернёт уровень Subcategory

Операции над наборами

MDX предоставляет богатый набор операций для манипулирования наборами:

Базовые операции

Объединение наборов - простое перечисление в фигурных скобках объединяет наборы с удалением дубликатов:

{[Product].[Category].[Bikes], 
 [Product].[Category].[Clothing],
 [Product].[Category].[Bikes]}  -- Bikes появится только один раз

Декартово произведение (CrossJoin) - создаёт все возможные комбинации членов из двух наборов:

CrossJoin(
    [Product].[Category].Members,
    [Date].[Calendar Year].Members
)

Функции для работы с наборами

Members - возвращает все члены уровня или иерархии:

[Product].[Category].Members  -- Все категории
[Product].[Product Categories].Members  -- Вся иерархия

CurrentMember - возвращает текущий член в контексте вычисления:

[Product].[Category].CurrentMember

DefaultMember - возвращает член по умолчанию для иерархии:

[Date].[Calendar].DefaultMember  -- Обычно возвращает All Periods

Контекст и область видимости

Понимание контекста критически важно при работе с членами и наборами. Контекст определяет, какой член из каждого измерения активен в данный момент вычисления.

Явный и неявный контекст

Явный контекст устанавливается через:

  • Указание членов на осях запроса
  • Использование WHERE для среза
  • Явное указание в формулах

Неявный контекст определяется через:

  • Default members измерений
  • Текущую позицию при итерации по набору
  • Наследование от родительских вычислений

Функция CurrentMember в контексте

CurrentMember - одна из важнейших функций для работы с контекстом:

WITH MEMBER [Measures].[Category Name] AS
    [Product].[Category].CurrentMember.Name
SELECT 
    {[Measures].[Internet Sales Amount],
     [Measures].[Category Name]} ON COLUMNS,
    [Product].[Category].Members ON ROWS
FROM [Adventure Works]

В этом примере CurrentMember будет меняться для каждой строки результата, возвращая соответствующую категорию.

Иерархические операции

MDX предоставляет специальные функции для навигации по иерархиям:

Ancestors и Descendants

Ancestors - возвращает предков члена на указанном уровне:

Ancestors(
    [Product].[Product Categories].[Product].[Mountain-100 Black, 42],
    [Product].[Product Categories].[Category]
)
-- Вернёт категорию Bikes

Descendants - возвращает потомков члена:

Descendants(
    [Product].[Product Categories].[Category].[Bikes],
    [Product].[Product Categories].[Subcategory]
)
-- Вернёт все подкатегории велосипедов

Практическое упражнение: Комплексная работа с наборами

Теперь применим изученную теорию на практике. Откройте плагин "Слайдер данные" и выполните следующий запрос:

WITH 
MEMBER [Measures].[Parent Category] AS
    [Product].[Product Categories].CurrentMember.Parent.Name
MEMBER [Measures].[Children Count] AS
    COUNT([Product].[Product Categories].CurrentMember.Children)
SELECT 
    {[Measures].[Internet Sales Amount],
     [Measures].[Parent Category],
     [Measures].[Children Count]} ON COLUMNS,
    [Product].[Product Categories].[Subcategory].Members ON ROWS
FROM [Adventure Works]
WHERE ([Date].[Calendar Year].&[2013])

Этот запрос демонстрирует:

  • Создание вычисляемых мер с использованием навигационных свойств
  • Работу с CurrentMember для получения контекстной информации
  • Использование функции COUNT для подсчёта членов в наборе
  • Комбинирование всех концепций в одном запросе

Домашнее задание

Задание 1: Базовая работа с наборами

Создайте запрос, который покажет продажи для набора из трёх конкретных подкатегорий продуктов по вашему выбору, используя явное перечисление в фигурных скобках.

Задание 2: Диапазоны и навигация

Используя диапазон, выведите продажи за месяцы с марта по август 2013 года в разрезе категорий продуктов.

Задание 3: Свойства членов

Создайте вычисляемую меру, которая будет показывать уникальное имя текущего члена измерения Customer Geography.

Контрольные вопросы

  1. В чём разница между членом и набором?
  2. Почему порядок элементов в наборе важен?
  3. Как MDX обрабатывает дубликаты в наборах?
  4. Что возвращает функция CurrentMember?
  5. В чём разница между Members и Children?
  6. Как создать диапазон членов?
  7. Что такое контекст в MDX?

Заключение

В этом уроке мы изучили фундаментальные концепции MDX - члены и наборы. Мы узнали, как создавать наборы различными способами, как навигировать по иерархиям и как использовать контекст для создания динамических вычислений. Эти знания станут основой для всей дальнейшей работы с MDX.

В следующем уроке мы изучим продвинутые функции навигации, которые позволят нам создавать ещё более сложные и гибкие запросы.

Модуль 2: Основы синтаксиса MDX • Урок 2.3

Следующий урок!
Прошлый урок