Язык запросов MDX

СайтыпроMDX:

mdx.far.ru

sqlmdx.narod.ru

ЯЗЫКЗАПРОСОВMDX

КалюжныйО.Н.,

oleg212121@yandex.ru

Введение

Язык MDX был впервые представлен как составляющая OLE DB for OLAP в 1997г. компанией Microsoft. MDX создан группой разработчиков SQL Server (Mosha Pasumansky и другие). Вскоре последовала коммерческая реализация языка в Microsoft OLAP Services 7.0 (1998г.), затем -в Microsoft Analysis Services. Последняя версия OLE DB for OLAP была выпущена компанией Microsoft в 1999г.

Несмотря на то, что MDX является не общим стандартом, а только внутренней спецификацией Microsoft, он был принят многими ведущими распространителями технологии OLAP. В их числе разработчики серверных приложений, такие, как Applix, Microstrategy, SAS, SAP, Whitelight, NCR, а также разработчики клиентских приложений: Panorama Software, Proclarity, AppSource, Cognos, Business Objects, Brio Technology, Crystal Reports, Microsoft Excel, Microsoft Reporting Services и другие.

С появлением XML for Analysis, в котором MDX был принят как стандартный язык запросов, все большее число компаний (в их числе, например, Hyperion Solutions), стали поддерживать MDX.

XML for Analysis обращается к OLE DB for OLAP с помощью языка запросов MDX. В приложении Analysis Services 2005 компанией Microsoft были добавлены некоторые расширения MDX, такие, как подзапросы (subselects). В таких продуктах, как Microsoft Excel 2007, эти расширения уже применяются.

( введение переведено с Wikipedia.org )

Основные объекты многомерных баз данных

Основные элементы структуры многомерных баз данных – Кубы (Cubes), Измерения (Dimensions) и Меры (Measures).

Куб (Cube) — совокупность данных, имеющая многомерную структуру. Куб представлен набором мер и измерений. Измерений может быть много, но, т.к. нам легче представить себе трехмерный объект, такой объект назвали Кубом.

Рассмотрим эти понятия на примере базы данных клиентов.

Пусть наш куб содержит данные клиентов: ФИО, дату рождения, место рождения, пол, место жительства, а также календарь и список населенных пунктов. В случае реляционной базы данных можно было организовать 3 таблицы:[Населенные пункты], [Календарь] и [Паспортные данные]; причем в [Паспортных данных] присутствовали бы поля, связанные с соответствующими полями из [Календаря] и [Населенных пунктов]. В многомерном случае можно задать, например, такие измерения: [Клиенты], [Дата], [Место], [Тип места] (рожденияилижительства), [Пол].

На пересечении этих измерений зададим некоторые агрегированные величины -меры. Например: [Количество клиентов], [Максимальный возраст].

Пример(*): Сколько клиентов мужского пола проживает в Твери? Ответ можно получить, задав следующий MDX-запрос:

SELECT { [Место].[РФ].[Тверь] } ON COLUMNS,

{ [Пол].[М] } ON ROWS

FROM [Наш куб данных]

WHERE ([Measures].[Количество клиентов] , [Тип места].[Место жительства])

В данном запросе присутствуют лишь 3 измерения: [Место], [Тип места] и [Пол]; все измерения, не указанные в запросе ([Клиенты] и [Дата]), присутствуют в нем неявно.

Следует отметить, что совокупность мер является, по сути, еще одним измерением.

Как видим, синтаксис MDS очень похож на синтаксис SQL. К синтаксису запросов вернемся позднее, а пока рассмотрим другие важные понятия.

Члены измерений (Members). Иерархии (Hierarchies).

В рассмотренном выше примере мы пользовались измерением [Место], детализируя его с помощью заданной на нем иерархии. Делается это с помощью членов измерения, т.е. единиц описания на различных уровнях иерархии.

Примеры членов измерения: [РФ], [Белоруссия], [Минск], [ул. Северная], [дом №70], [дом №95] ит.д.

До каждого члена можно «добраться», описав путь к нему по иерархической структуре. Наример: [Место]. [Иерархия_Место].[РФ].[Тверь].[Петербургское шоссе].[дом №777].[квартира №8888], [Место]. [Иерархия_Место].[РФ].[Москва]

Замечание: в приведенных примерах использована подробная запись:

[<Измерение>].[<Иерархия>].[<Член верхнего уровня>]. … .[<Член нижнего уровня>]

В некоторых случаяхуникальныевпределахизмеренияэлементы такой записи можно опускать.

Можно организовать несколько иерархий для одного измерения, например:

[Дата].[Иерархия1].[<Год>].[<Месяц>].[<Число>] и

[Дата].[Иерархия2].[<№ недели>].[<День недели>]

Замечание: в случае единственной иерархии на нее можно сослаться по имени измерения, то есть: [Дата].[Иерархия1].Members эквивалентно [Дата].Members , [Место].[Иерархия_Место].[Города].Members эквивалентно [Место].[Города].Members .

Каждому уровню иерархии (Level) присвоено свое имя. Имена уровней применяются в конструкциях вида:

[<Измерение>].[<Иерархия>].[<Уровень>].Members .

Например: [Дата].[ Иерархия1].[Месяца].Members – все возможные месяца; [Место].[Иерархия_Место].[Улицы].Members – все улицы, независимо от страны и города.

Кортежи (Tuples) и множества (Sets)

Кортеж — это набор членов одного или нескольких разных измерений. Задавая кортеж, мы указываем на конкретную ячейку или набор ячеек внутри куба. Таким образом, кортеж – это декартово произведение (т.е. пересечение) множеств, определенных на различных измерениях куба.

Кортежи задаются с помощью круглых скобок.

Примеры:

( [Место].[РФ].[Рязань].[улица Есенина], [Пол].[Ж], [Тип места].[Место жительства] )– все дамы с улицы Есенина в Рязани;

( [Место].[РФ].[Тамбов], [Тип места].[Место рождения] ) – все клиенты, родившиеся в Тамбове.

В языке MDX пересечения множеств реализуются с помощью конструкций CrossJoin <Кортеж>, Where <Кортеж> и других, что обусловлено необходимостью представить результат в удобном для восприятия виде.

Множество (или Набор) — это совокупность (объединение) кортежей, определенных с использованием одинакового количества одних и тех же измерений.

Примеры:

{ [Дата].[1960].[Январь], [Дата].[1960].[Февраль] } – все клиенты, родившиеся в январе или в феврале 1960г.

{ ( [Место].[РФ].[Ростов] , [Тип места].[Место жительства] , [Дата],[1980] ) , ( [Место].[РФ].[Воронеж] , [Тип места].[Место жительства] , [Дата],[1980] ) } -все клиенты 1980 года рождения, проживающие в Ростове или в Воронеже.

Множество заключается в фигурные скобки.

Пересечение кортежа или множества с какой-либо мерой дает значение меры на данном множестве. В первом разобранном нами примере (*) мы имели пересечение кортежа ( [Место].[РФ].[Тверь], [Пол].[М] ) с мерой [Measures].[Количество клиентов].

Член по умолчанию (default member)

Как уже упоминалось, что в большинстве случаев в кортежах явно присутствуют не все измерения. Чтобы получить значение меры на кортеже, нужно учесть все прочие измерения. Для этого у каждого измерения существует член по умолчанию. Как правило, в роли Default Member выступаетединственныйчлен специального уровня иерархии [All], автоматически создаваемого при создании измерения. Этот уровень содержит совокупные результаты по всему измерению.

Пример:

([Клиенты].[All].Members, [Measures].[Максимальный возраст]) – этот кортеж возвращает возраст самого старшего клиента.

Эквивалентное указание на член по умолчанию можно записать короче и корректнее с помощью выражения DefaultMember:

[Клиенты].DefaultMember .

Если уровень [All] отсутствует, в его роли выступает первый член следующего уровня. Например, для нашего измерения Дата это будет [Дата].[1900], если в кубе нет более ранних годов.

В некоторых системах членом по умолчанию можно назначить любой член или MDX-выражение измерения.

Поскольку совокупность мер ([Measures]) тоже является одним из измерений, то и среди мер есть элемент по умолчанию.

Предположим, что в нашем случае мерой по умолчанию является [Количество клиентов]. Тогда, если из нашего запроса (*) удалить конструкцию WHERE ([Measures].[Количество клиентов]), результат его выполнения останется прежним.

Общий вид запроса

Простейший вид запроса MDX выглядит следующим образом:

SELECT <множество1> ON COLUMNS, <множество2> ON ROWS FROM <куб> WHERE <кортеж>

На каждой из осей (columns, rows и др.) можно располагать несколько измерений, например:

SELECT { CrossJoin ( { [Место].[РФ].[Урюпинск] }, { [Дата].[1970].[Февраль] } ) } ON COLUMNS, { [Клиенты].Children } ON ROWS FROM [Наш куб данных] WHERE ([Тип места].[Место жительства], [Measures].[Количество клиентов])

Этот запрос возвращает всех клиентов, проживающих в Урюпинск