Введение: Основа многомерной модели данных
Добро пожаловать в третий урок модуля синтаксиса 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.
Контрольные вопросы
- В чём разница между членом и набором?
- Почему порядок элементов в наборе важен?
- Как MDX обрабатывает дубликаты в наборах?
- Что возвращает функция CurrentMember?
- В чём разница между Members и Children?
- Как создать диапазон членов?
- Что такое контекст в MDX?
Заключение
В этом уроке мы изучили фундаментальные концепции MDX - члены и наборы. Мы узнали, как создавать наборы различными способами, как навигировать по иерархиям и как использовать контекст для создания динамических вычислений. Эти знания станут основой для всей дальнейшей работы с MDX.
В следующем уроке мы изучим продвинутые функции навигации, которые позволят нам создавать ещё более сложные и гибкие запросы.