Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / MSOLAP Неправильные иерархические измерения / 21 сообщений из 21, страница 1 из 1
24.08.2005, 14:12
    #33231827
новый2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSOLAP Неправильные иерархические измерения
Уважаемые знатоки MSOLAP

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

Как ни бился над проблемой никак создать такое измрение в AS2000 не получается
Может все-таки есть какой способ?

И как я понял, такой возможности нет и в AS2005
Или я все же ошибаюсь?
...
Рейтинг: 0 / 0
24.08.2005, 14:46
    #33231937
Владимир Штепа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSOLAP Неправильные иерархические измерения
Новый2Уважаемые знатоки MSOLAP

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

Как ни бился над проблемой никак создать такое измрение в AS2000 не получается
Может все-таки есть какой способ?

И как я понял, такой возможности нет и в AS2005
Или я все же ошибаюсь?

Наверное вот так в лоб в общем виде и не провернешь, но наверняка, множество решаемых вами задач можно свести к более конкретному случаю, который можно изоложить в терминах возможностей AS2K(5).
...
Рейтинг: 0 / 0
24.08.2005, 14:58
    #33231985
AAron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSOLAP Неправильные иерархические измерения
А разбить граф на несколько измерений (возможно виртуальных) не подходит?
...
Рейтинг: 0 / 0
24.08.2005, 15:06
    #33232004
новый2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSOLAP Неправильные иерархические измерения
Если подскажете как - буду очень благодарен

Как конкретный пример: есть справочник территорий ОКАТО
И есть справочник вхождений территорий {parent,child}. А способов териториального деления существует несколько (Административное деление, Экономическое)
Получается корней несколько, а листья и ветви из которых они собираются одни и те же.
Вот и непонятно как это реализовать в AS2000 или хотя бы в AS2005 :((
...
Рейтинг: 0 / 0
24.08.2005, 15:16
    #33232038
новый2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSOLAP Неправильные иерархические измерения
to AAron
Про разбиение на несколько измерений уже думали, но:
1. это уже не то что хотелось бы (нужно будет постоянно манипулировать разными изменениями с одинаковым смыслом). Неудобно - это пол беды
2. как я понял, придется разбивать не только измерение, но и куб - а это еще большие проблемы (Хотелось бы ошибаться в данном вопросе)
3. структура графа может меняться (это справочник), это означает, что нужно постоянно переразбивать граф, убивать и создавать измерения и кубы - это выглядит практически нереальным

Вот и вопрос возник, может есть какое решение и стоит ли надеяться на AS2005
...
Рейтинг: 0 / 0
25.08.2005, 10:55
    #33233428
Yuri Abele
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSOLAP Неправильные иерархические измерения
это вот такая связь что ли?
...
Рейтинг: 0 / 0
25.08.2005, 11:23
    #33233535
Yuri Abele
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSOLAP Неправильные иерархические измерения
Такая "раскрутка" устроит?
...
Рейтинг: 0 / 0
25.08.2005, 13:04
    #33233971
Владимир Штепа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSOLAP Неправильные иерархические измерения
То что предлагает Юрий Абель, легко релизуется одним измерением с несколькими иерархиями.
...
Рейтинг: 0 / 0
25.08.2005, 13:26
    #33234043
Yuri Abele
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSOLAP Неправильные иерархические измерения
backfireТо что предлагает Юрий Абель, легко релизуется одним измерением с несколькими иерархиями.
Parent-Child измерением, если быть точным.
Просто хотел сначала убедится, что автора топика это устроит, а потом показывать решение. ;)

P.S. /Off-Topic/ Моя фамилия не склоняется
...
Рейтинг: 0 / 0
25.08.2005, 13:40
    #33234089
Yuri Abele
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSOLAP Неправильные иерархические измерения
Кстати это та же самая ситуация, когда (у нас а проекте так) есть список видов расходов. Они могут собираться в дерево (к примеру "кифир" входит в группу "молочные продукты").
Но, для каких-то аналитических нужд существуют несколько моделей этих деревьев. Т.е., один и тот же вид расхода может оказаться в нескольких деревьях и, тем самым, иметь несколько родителей.
...
Рейтинг: 0 / 0
26.08.2005, 10:15
    #33235469
новый2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSOLAP Неправильные иерархические измерения
На самом деле требуется с несколькими вершинами (как на рис)
Но, наверное, это одно и тоже?
Непонятно, как можно можно в одно измерение поместить 4 раза узел F и заставить его собираться по разным веткам

Поделитесь пожалуйста решением
...
Рейтинг: 0 / 0
26.08.2005, 14:35
    #33236293
OLAPMASTER
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSOLAP Неправильные иерархические измерения
Новый2Если подскажете как - буду очень благодарен

Как конкретный пример: есть справочник территорий ОКАТО
И есть справочник вхождений территорий {parent,child}. А способов териториального деления существует несколько (Административное деление, Экономическое)
Получается корней несколько, а листья и ветви из которых они собираются одни и те же.
Вот и непонятно как это реализовать в AS2000 или хотя бы в AS2005 :((


Административное деление, Экономическое - Это все объясняет.

Если эл. Административное деление точно такие же как и эл. Экономическое деление, то это два разных измерения иначе вы задвоите данные.

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

Это все справидливо если я правильно Вас понял.

Корень Уровень 1 Уровень 2 Элементы -- Так моно
-\\- Админ. Эконом. -\\-

Корень Уровень 1
--\-- Админ, Эконом Элементы - Так будеть задвоение.
...
Рейтинг: 0 / 0
26.08.2005, 14:46
    #33236322
новый2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSOLAP Неправильные иерархические измерения
to OLAPMASTER
Я немного другое имел ввиду
Ситуация примерно как на предыдущей картинке
А "Административное и Экономическое деление" - это уже интерпретация нескольких корней, которые собираются из общих листьев и ветвей

Т.е я хотел сказать, что понятно что это Parent-Child измерение, но как именно это реализовать - БОЛЬШОЙ вопров

to Yuri Abele

авторТакая "раскрутка" устроит?
Устроит!!! Пожалуйста расскажите как вы этого добились от AS2000
...
Рейтинг: 0 / 0
26.08.2005, 14:50
    #33236337
OLAPMASTER
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSOLAP Неправильные иерархические измерения
Новый2to OLAPMASTER
Я немного другое имел ввиду
Ситуация примерно как на предыдущей картинке
А "Административное и Экономическое деление" - это уже интерпретация нескольких корней, которые собираются из общих листьев и ветвей

Т.е я хотел сказать, что понятно что это Parent-Child измерение, но как именно это реализовать - БОЛЬШОЙ вопров

to Yuri Abele

авторТакая "раскрутка" устроит?
Устроит!!! Пожалуйста расскажите как вы этого добились от AS2000

Тогда последний вопрос, скажите листья однозначно принадлежат корню?
Есть возможность вхождения одного листа в два корня? или принадлежность одно листа к двум членам одного уровня?
...
Рейтинг: 0 / 0
26.08.2005, 15:41
    #33236517
новый2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSOLAP Неправильные иерархические измерения
OLAPMASTERТогда последний вопрос, скажите листья однозначно принадлежат корню?
Листья принадлежат одному или нескольким корням

OLAPMASTERЕсть возможность вхождения одного листа в два корня?
Есть возможность вхождения одного листа в два корня (это и есть основная проблема). Они могут входить в 2,3 и т.д. корней. Я потому и написал, что это не дерево, а направленный граф

OLAPMASTER или принадлежность одно листа к двум членам одного уровня?
На понял этого вопроса
...
Рейтинг: 0 / 0
29.08.2005, 15:43
    #33239235
новый2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSOLAP Неправильные иерархические измерения
Yuri AbeleТакая "раскрутка" устроит?
Расскажите пожалуйста, как вы это сделали
...
Рейтинг: 0 / 0
29.08.2005, 15:54
    #33239265
Yuri Abele
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSOLAP Неправильные иерархические измерения
Новый2 авторТакая "раскрутка" устроит?
Устроит!!! Пожалуйста расскажите как вы этого добились от AS2000
Виноват, что молчал - на выходных был. Рассказываю:

Проблема наша где? - в Analisysis Services, т.к. ему необходимы как уникальные ID детей, так и только по одному родителю у ребенка. Тогда поступаем так:
Для каждой уникальной комбинации Paren-Child строится таблица переводов.
Для упомянутой моей картинки (см. ниже):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 ID1 Child Parent
1   A     NULL
2   B     A
3   C     A
4   D     B
5   E     B
6   E     C
7   F     D
8   F     E
9   F     C 
Где ID - искусственно генерящийся (обыкновенный IDENTITY(1,1)) уникальный ключ.
Табличку можно конечно и каждый раз перегенерить, но проще в режиме дополнения появившимися новыми комбинациями.
Вот так:
Код: plaintext
1.
2.
3.
4.
INSERT INTO TranslateChild(Path, Child, Parent)
SELECT DISTINCT S.Child + '\' + S.Parent, S.Child, S.Parent
FROM TranslateTable TT LEFT OUTER JOIN Source S
  ON TT.Path = S.Child + '\' + S.Parent
WHERE S.Child IS NULL

Для упрощения понимания я оставлю только наш проблемный узел F с его родителями:
Код: plaintext
1.
2.
3.
 ID1 Child Parent
5   E     B
6   E     C
8   F     E 

Теперь для каждого уникального идентификатора ребенка найдем соотв. ему идентификатор родителя. Здесь получится дублирование:
Код: plaintext
1.
2.
3.
4.
 ID1 PID1 Child Parent
5   NULL E     B
6   NULL E     C
8   5    F     E
8   6    F     E 

Повторяющиеся родители нас (точнее Analisys Services) не устраивают, поэтому генерим еще один уникальный ID:
Код: plaintext
1.
2.
3.
4.
 ID2 ID1 PID1 Child Parent
1   5   NULL E     B
2   6   NULL E     C
3   8   5    F     E
4   8   6    F     E 
Т.е. получаем не одинаковые идентификаторы одинаковых родителей.

Из это уже таблицы строим таблицу описывающую Parent-Child Hierarchie:
Код: plaintext
1.
2.
3.
4.
 OLAP_ID OLAP_PID Child Parent
\5      \1       E     B
\6      \2       E     C
5\8     5\3      F     E
6\8     6\4      F     E 
Я для наглядности склеил просто символы идентификаторов, но можно тоже сгенерить числовые идентивикаторы.
Все, эту уже табличку подставляем в OLAP для построения иерархии.
Связь же с таблицей фактов по полям Child и Parent.
...
Рейтинг: 0 / 0
29.08.2005, 18:35
    #33239717
новый2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSOLAP Неправильные иерархические измерения
Большое спасибо за отклик
...
Рейтинг: 0 / 0
29.08.2005, 19:07
    #33239765
Yuri Abele
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSOLAP Неправильные иерархические измерения
Похоже, что я на последнем шаге что-то не то нарисовал - по памяти рассказывал. Может все и правильно - ща переварю
...
Рейтинг: 0 / 0
31.08.2005, 00:11
    #33242292
Yuri Abele
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSOLAP Неправильные иерархические измерения
Исправлено:

Проблема наша где? - в Analisysis Services, т.к. ему необходимы как уникальные ID детей, так и только по одному родителю у ребенка. Тогда поступаем так:

1. Для каждой уникальной комбинации Paren-Child строится таблица переводов (translate).
Для упомянутой моей картинки (см. ниже):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
ID1 Child Parent
1   A     NULL
2   B     A
3   C     A
4   D     B
5   E     B
6   E     C
7   F     E
8   F     D
9   F     C

Где ID - искусственно генерящийся (обыкновенный IDENTITY(1,1) ) уникальный ключ.
Табличку можно конечно и каждый раз перегенерить, но проще в режиме дополнения появившимися новыми комбинациями.

Вот так:
Код: plaintext
1.
2.
3.
4.
INSERT INTO TranslateChild(Path, Child, Parent)
SELECT DISTINCT S.Child + '\' + S.Parent, S.Child, S.Parent
FROM TranslateTable TT LEFT OUTER JOIN Source S
  ON TT.Path = S.Child + '\' + S.Parent
WHERE S.Child IS NULL


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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
ID1 Child Parent
1   A     NULL
2   B     A
3   C     A
4   D     B
 5   E     B
6   E     C
7   F     E 
8   F     D
9   F     C

2. Теперь для каждого уникального идентификатора ребенка найдем соотв. ему идентификатор родителя.
Здесь получится дублирование в первом столбце:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
ID1 PID1 Child Parent
1   NULL A     NULL
2   1    B     A
3   1    C     A
4   2    D     B
 5   2    E     B
6   3    E     C
7   5    F     E
7   6    F     E 
8   4    F     D
9   3    F     C

3. Дублирование нас (и Analisys Services) не устраивает, поэтому генерим еще один уникальный ID ( ID2 ):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
ID2 ID1 PID1 Child Parent
1   1   NULL A     NULL
2   2   1    B     A
3   3   1    C     A
4   4   2    D     B
 5   5   2    E     B
6   6   3    E     C
7   7   5    F     E
8   7   6    F     E 
9   8   4    F     D
10  9   3    F     C

4. Идя по цепочке ID2 -> PID1 -> ID1 -> ID2 находим новый PID2 .
(см. в конце второе домашнее задание)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
ID2 PID2 ID1 PID1 Child Parent
1   NULL 1   NULL A     NULL
2   1    2   1    B     A
3   1    3   1    C     A
4   2    4   2    D     B
 5   2    5   2    E     B
6   3    6   3    E     C
7   5    7   5    F     E
8   6    7   6    F     E 
9   4    8   4    F     D
10  3    9   3    F     C

5. Старые ID, PID и Parent (ID1, PID1 и Parent) в новом результате не нужны и их можно опустить:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
ID2 PID2 Child
1   NULL A
2   1    B
3   1    C
4   2    D
 5   2    E 
6   3    E
7   5    F
8   6    F 
9   4    F
10  3    F

Все, эту уже табличку подставляем в OLAP для построения иерархии.
Связь же с таблицей фактов по полю Child .

Я расписал все в пять шагов, но это для понятности. Некоторые соседние шаги можно слить в один.
Но это, так сказать, домашнее задание ;)

Еще одно домашнее задание - похоже, что старый PID1 и новый PID2 одинаковы. Возможно и так - проверять не охота.
...
Рейтинг: 0 / 0
01.09.2005, 13:13
    #33245821
новый2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSOLAP Неправильные иерархические измерения
Спасибо Yuri Abele!!!
Я создал таблицную функцию
Похоже, что все работает как надо!!!
Только у меня получись, что пункты 3,4,5 нужно повторять до тех пор, пока не исчезнут задвоения ID
Вот функция (если кому интересно):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
CREATE FUNCTION parent_child() 
RETURNS @res TABLE (
	id INT, 
	pid INT, 
	parent VARCHAR( 20 ) COLLATE database_default,
	child VARCHAR( 20 ))
AS
BEGIN
	DECLARE @tbl TABLE ( -- Таблица для первмчной нумерации
		id INT IDENTITY, 
		pid INT, 
		parent VARCHAR( 20 ) COLLATE database_default ,
		child VARCHAR( 20 ) COLLATE database_default )
	DECLARE @tbl2 TABLE ( -- Таблица для перенумерации дублирующихся записей
		id2 INT IDENTITY, 
		id INT, 
		pid INT, 
		parent VARCHAR( 20 ) COLLATE database_default,
		child VARCHAR( 20 ) COLLATE database_default)
	-- Соединяем таблицу связей и справочник и нумеруем
	INSERT INTO @tbl(parent,child)
		SELECT DISTINCT g.parent AS parent,d.id AS child 
		FROM source_graph g RIGHT OUTER JOIN source_dim d ON g.child=d.id  
	-- Повторяем до тех пор пока не будет повторяющихся идентификаторов
	WHILE (NOT EXISTS(SELECT  1  FROM @res)) AND EXISTS(SELECT  1  FROM @tbl)
	BEGIN
		IF NOT EXISTS(SELECT  1  FROM @tbl2)
		BEGIN
			-- это выполняется в первой итерации
			-- тут мы ищем для каждого ребенка ID его родителя
			-- при этом иногда задваиваются ID ребенка, поэтому мы присваивает уникальный ID2
			INSERT INTO @tbl2(id,pid,parent,child)
				SELECT t1.id AS id ,t2.id AS pid ,t1.parent AS parent ,t1.child AS child
				FROM @tbl t1 LEFT OUTER JOIN @tbl t2 ON t1.parent=t2.child
		END
		-- находим новый идентификатор родителя из поля ID2
		-- тут опять могут задваиваться ID ребенка
		INSERT INTO @res(id,pid,parent,child)
			SELECT t1.id2 AS id,t2.id2 AS pid, t1.parent AS parent,t1.child AS child
			FROM @tbl2 t1 LEFT OUTER JOIN @tbl2 t2 ON t1.pid=t2.id
		-- Проверяем: если задваиваются ID ребенка
		IF EXISTS(SELECT COUNT(*) FROM @res GROUP BY id HAVING COUNT(*)> 1 )
		BEGIN
			-- Повторяем цикл перенумерации
			DELETE FROM @tbl2
			INSERT INTO @tbl2(id,pid,parent,child)
				SELECT id, pid, parent, child
				FROM @res
			-- Чтобы повторился цикл
			DELETE FROM @res
		END
	END
	-- Поскольку мы несколько раз зпролняли и удаляли из @tbl2
	-- то нумерация результата начинается не с 1
	-- исправляем это
	DECLARE @min_val INT
	SELECT @min_val=MIN(id)- 1  FROM @res
	IF @min_val> 0 
		UPDATE @res SET id=id-@min_val, pid=pid-@min_val
	RETURN
END
...
Рейтинг: 0 / 0
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / MSOLAP Неправильные иерархические измерения / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]