Автор: Александр ДЕНИСЕНКО aden@online.ru, aledin@academy.ru
Одна из проблем навигации по координате времени во
многомерных кубах заключается в несовместимости недельного и
месячного календарей. С одной стороны, вышележащим в иерархии
объектом для суток бывает месяц (выше - квартал и/или год), а
бывает - что неделя. Неделя не сворачивается в месяц - её
начало может оказаться в одном месяце, а окончание - в другом.
Системы типа [1] допускают работу с такими объектами, но
довольно сложными приёмами. Традиционное представление об
иерархии не допускает такого: представьте файл, разорванный
между двумя папками. Или матрешку, голова которой находится в
одной материнской игрушке, а низ - в другой. К сожалению,
использование нескольких иерархий по одной координате имеет
некоторые проблемы в реализации - так, например, в [1] не
удается использовать одну координатную таблицу для двух разных
иерархий времени - понедельной и помесячной.
На практике
есть и ещё одна техническая неприятность: разная нумерация
дней недели в разных культурах. В Западной неделя начинается с
воскресенья, в нашей - с понедельника. Это приводит к
некорректной работе многих стандартных функций работы с датами
(одна и та же неделя имееет разные порядковые номера с разных
точек зрения). В [1] имеется специальная операция установки
первого дня недели, но она имеет ограниченное действие (в
пределах сеанса соединенния клиента с сервером). В части [1],
касающейся многомерного анализа, такую операцию вообще не
удалось обнаружить. Это еще один аргумент в пользу наличия
собственных встроенных календарей.
Анализ продаж как
правило требует обоих иерархий, причем в двух вариантах:
включая или исключая осколки "разорванных" недель
месяца.
Например, в июле 2003 года пять недель - первая
неделя июля начинается со вторника, пятая заканчивается
четвергом. Проблема в том, что понедельник первой недели и
посление три дня пятой недели требуется включать в обобщенные
показатели или не включать - по желанию наблюдателя.
Был
предложен следующий вариант решения. Создаем две координаты
времени как стандартные иерархии, одну - с уровнями "день",
"месяц", "год"; другую - с уровнями "День" и "неделя". Недели
занумерованы "От Адама", то есть как и годы (от Сотворения
Мира, Рождества или начальной даты Микрософта, Хиждры и т.д. -
как правило хватает периода существования фирмы). Для удобства
наблюдателя недели поименованы граничными датами.
Далее -
дублируем поле даты в фактовой таблице. Первое поле - Дата1 -
ссылается на помесячный календарь, а второе поле - Дата2 - на
недельный. В навигаторе появляются две разные координаты. С
математической точки зрения мы погружаем наш куб в
пространство размерности на единицу больше начального.
Дополнительная координата совпадает с начальной координатой
даты. Можно представить себе, что наш кубик "расплющен" по
диагонали, образованной двумя координатами (Дата1=Дата2 по
построению).
В итоге наблюдатель волен захватывать или
исключать из обобщенных показателей осколки пограничных недель
- то есть в нашем примере - 30 июня (понедельник, первый день
первой "июльской" недели и 1,2,3 августа - хвост пятой
"июльской" недели). Для исключения обрывков достаточно по
недельной координате выбрать требуемые недели, а по месячной
указать "июль".
Для захвата голов и хвостов достаточно в
помесячной координате снять все ограничения (указать имя всей
координаты вроде 'ALL').
[В начало]