powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / MSOLAP Неправильные иерархические измерения
21 сообщений из 21, страница 1 из 1
MSOLAP Неправильные иерархические измерения
    #33231827
новый2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые знатоки MSOLAP

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

to Yuri Abele

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

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

to Yuri Abele

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

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

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

OLAPMASTER или принадлежность одно листа к двум членам одного уровня?
На понял этого вопроса
...
Рейтинг: 0 / 0
MSOLAP Неправильные иерархические измерения
    #33239235
новый2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yuri AbeleТакая "раскрутка" устроит?
Расскажите пожалуйста, как вы это сделали
...
Рейтинг: 0 / 0
MSOLAP Неправильные иерархические измерения
    #33239265
Фотография Yuri Abele
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый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
MSOLAP Неправильные иерархические измерения
    #33239717
новый2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое спасибо за отклик
...
Рейтинг: 0 / 0
MSOLAP Неправильные иерархические измерения
    #33239765
Фотография Yuri Abele
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже, что я на последнем шаге что-то не то нарисовал - по памяти рассказывал. Может все и правильно - ща переварю
...
Рейтинг: 0 / 0
MSOLAP Неправильные иерархические измерения
    #33242292
Фотография Yuri Abele
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исправлено:

Проблема наша где? - в 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
MSOLAP Неправильные иерархические измерения
    #33245821
новый2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо 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
21 сообщений из 21, страница 1 из 1
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / MSOLAP Неправильные иерархические измерения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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