Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / написание CM (MSAS) поиск непустого значения.. / 25 сообщений из 42, страница 1 из 2
09.02.2005, 12:54
    #32907979
cherox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написание CM (MSAS) поиск непустого значения..
MSAS2000

помогите написать CM.. Хочу найти по конкретной оси первого мембера с интересующим меня непустым значением measure. Что-то типа

([Дата].PrevMember.datamember, [Measures].[Price]) только вместо PrevMember - незнаемое мне :)
сейчас выкручиваюсь

CoalesceEmpty(Price, ([Дата].Lag(1),Price), ([Дата].Lag(2),Price), ([Дата].Lag(3),Price), ([Дата].Lag(4),Price), ([Дата].Lag(5),Price), ([Дата].Lag(6),Price), ([Дата].Lag(7),Price), ([Дата].Lag(8),Price), ([Дата].Lag(9),Price), ([Дата].Lag(10),Price))

но поиск распространяется соотвественно только на 10 дней вниз, да и хотелось попроще структуру поиска (если возможно)
...
Рейтинг: 0 / 0
09.02.2005, 14:53
    #32908343
Dmitry Biryukov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написание CM (MSAS) поиск непустого значения..
TopCount( NonEmptyCrossJoin( Дата.Level(1).Members ,{Price}), 1 )
...
Рейтинг: 0 / 0
10.02.2005, 06:11
    #32909261
Mosha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написание CM (MSAS) поиск непустого значения..
Дмитрий, а почему TopCount, а не Tail (или Head, зависит откуда считать первого мембера) ? Кроме того, NonEmptyCrossJoin несколько опасная функция если в кубе есть другие вычисления. Т.к. измерение время не очень большое, то надежнее
авторFilter(Time.Members, NOT IsEmpty(Price))

cherox - можно и с PrevMember, что-то типа

Код: plaintext
CREATE MEMEBR Measures.LastPrice AS ' iif(IsEmpty(Price), Time.PrevMember, Price) '

Моша
----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights
...
Рейтинг: 0 / 0
10.02.2005, 08:35
    #32909330
cherox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написание CM (MSAS) поиск непустого значения..
к сожалению, у меня не функционирует ни
TopCount( NonEmptyCrossJoin( Дата.Levels(3).Members ,{Price}), 1 )
в СM отказывается записываться, а если запросом MDX смотреть, то эта формула возвращает просто 1-й член измерения с заполненной Price. А это совсем не то, что требуется

Может плохо сформулировал, что хотелось?
Есть временнОе измерение, пусть с ним связаны факты с ценами (Price), напр.
01.01.05 - 12.00
10.01.05 - 17.00
15.01.05 - 20.00

хотелось, чтобы напротив скажем 05.01.05 было число 12.00(Т.е. первая нижестоящая по дате цена). Соответственно, 14.01.05 = 17.00, 31.01.05=20.00

т.к. разрывы между заполненными фактами по датам непредсказуемы (от отсутсвия разыва, до скажем года), то моя формула

CoalesceEmpty(Price, ([Дата].Lag(1),Price), ([Дата].Lag(2),Price), ([Дата].Lag(3),Price), ([Дата].Lag(4),Price), ([Дата].Lag(5),Price), ([Дата].Lag(6),Price), ([Дата].Lag(7),Price), ([Дата].Lag(8),Price), ([Дата].Lag(9),Price), ([Дата].Lag(10),Price)) некорректна для пустот с 10 дня

формулу Моши не пропускает MDX
(ни в оригинальном формате, ни в "расширенном")
with member [Measures].[Price3] as 'iif(IsEmpty([Price), ([Дата].PrevMember.datamember, [Measures].[Price]), Price)'

Может есть еще идеи?
...
Рейтинг: 0 / 0
10.02.2005, 09:12
    #32909364
Беляев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написание CM (MSAS) поиск непустого значения..
Что за расширенный формат ? :)
Формула Моши Вам поможет, только не торопитесь, скобки не теряйте и MEMBER правильно пишите

CREATE MEMBER [Measures].[Price3] AS ' iif(IsEmpty([Measures].[Price]), [Дата].PrevMember, [Measures].[Price]) '

Владислав Беляев
...
Рейтинг: 0 / 0
10.02.2005, 09:28
    #32909391
cherox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написание CM (MSAS) поиск непустого значения..
спсибо, к моему стыду, именно скобку и потерял при тестировании :)
...
Рейтинг: 0 / 0
10.02.2005, 10:41
    #32909561
Dmitry Biryukov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написание CM (MSAS) поиск непустого значения..
cheroxХочу найти по конкретной оси первого мембера с интересующим меня непустым значением measure
cheroxэта формула возвращает просто 1-й член измерения с заполненной Price
как говорится, за что боролись...
Это уже потом стало понятно, что "интересующий меня" = "предыдущий"

А работает ли эта формула?
Код: plaintext
iif(IsEmpty([Measures].[Price]), [Дата].PrevMember, [Measures].[Price])
...
Рейтинг: 0 / 0
10.02.2005, 10:51
    #32909598
Mosha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написание CM (MSAS) поиск непустого значения..
Я кстати не агитирую за рекурсивный подход, я просто предложил его как альтернативу. Если данные по времени dense, то рекурсия работать будет хорошо, а если данные по времени sparse, то стоит попробовать подход Дмитрия.
Вообще тема рекурсивных против итеративных подходов это интересная тема (например посмотрите дискуссию с backfire про Парето/ABC анализ неколько дней назад). Я включил обсуждение этой темы во вторую редакцию книги "Fast track to MDX".

Моша
----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights
...
Рейтинг: 0 / 0
10.02.2005, 12:07
    #32909863
cherox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написание CM (MSAS) поиск непустого значения..
to Dmitry Biryukov А работает ли эта формула?

работает.. только если предыдущей даты с ценой вообще не существует, то выскакивает ошибка "An unexpected internal error has occurred" (в Excel2003, SP1), в самом Analysis Manager не падает, #ERR пишет в таком случае в CM
...
Рейтинг: 0 / 0
10.02.2005, 15:45
    #32910414
Dmitry Biryukov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написание CM (MSAS) поиск непустого значения..
всё равно не догоняю как работает эта формула...
если цена не пустая, то её же и возвращаем - тут всё ок.
если же цена пустая - возвращаем предыдущую ДАТУ????
ну допустим вместо [Дата].PrevMember надо написать ([Дата].PrevMember, [Measures].[Price]). Ну тогда же вернётся цена на предыщую дату даже если она пустая!
Допустим, что Price - это СМ, формула которого тут приведена.
Но тогда для вычисления Price надо знать этот же самый Price - infinite recursion.
...
Рейтинг: 0 / 0
10.02.2005, 20:51
    #32911087
Mosha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написание CM (MSAS) поиск непустого значения..
Дмитрий - формула приведена для другого CM - с именем LastPrice. Вот как это выглядело несколько постов наверх:

Код: plaintext
CREATE MEMBER Measures.LastPrice AS ' iif(IsEmpty(Price), Time.PrevMember, Price) '

Т.е. нет бесконечной рекурсии.

Моша
----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights
...
Рейтинг: 0 / 0
10.02.2005, 21:45
    #32911121
Dmitry Biryukov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написание CM (MSAS) поиск непустого значения..
ну тогда
если цена пустая - возвращаем предыдущую ДАТУ????
ну допустим вместо [Дата].PrevMember надо написать ([Дата].PrevMember, [Measures].[Price]). Ну тогда же вернётся цена на предыщую дату даже если она пустая!
...
Рейтинг: 0 / 0
10.02.2005, 23:15
    #32911192
Mosha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написание CM (MSAS) поиск непустого значения..
Dmitry Biryukovну тогда
если цена пустая - возвращаем предыдущую ДАТУ????
ну допустим вместо [Дата].PrevMember надо написать ([Дата].PrevMember, [Measures].[Price]). Ну тогда же вернётся цена на предыщую дату даже если она пустая!
Нет, написать надо именно так как написал я - т.е. вернуть предыдушую дату. Я советую Вам попробовать эту формулу и посмотреть как она работает.

Моша
----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights
...
Рейтинг: 0 / 0
11.02.2005, 00:13
    #32911225
Владимир Штепа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написание CM (MSAS) поиск непустого значения..
MoshaВообще тема рекурсивных против итеративных подходов это интересная тема (например посмотрите дискуссию с backfire про Парето/ABC анализ неколько дней назад). Я включил обсуждение этой темы во вторую редакцию книги "Fast track to MDX".


А на рецензию книгу дадите? :-)
...
Рейтинг: 0 / 0
11.02.2005, 00:16
    #32911226
Dmitry Biryukov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написание CM (MSAS) поиск непустого значения..
я вижу что она работает
но как???
непонятен результат такого запроса
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
with member Measures.LastSales as 'iif(IsEmpty([Measures].[Unit Sales]), Time.PrevMember, [Measures].[Unit Sales])'
member Measures.Time_PrevMember as 'Time.PrevMember'
member Measures.Unit_Sales as '[Measures].[Unit Sales]'
member Measures.LastSales2 as 'iif(IsEmpty([Measures].[Unit Sales]), Time_PrevMember, [Unit_Sales])'
select 
    {[Measures].[Unit Sales], LastSales, Time_PrevMember, Unit_Sales ,  LastSales2} on columns, 
    [Time].[Month].Members on rows
from Sales
LastSales <> LastSales2, хотя, по-моему они одинаковые
...
Рейтинг: 0 / 0
11.02.2005, 00:16
    #32911227
Dmitry Biryukov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написание CM (MSAS) поиск непустого значения..
...
Рейтинг: 0 / 0
11.02.2005, 00:26
    #32911235
Владимир Штепа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написание CM (MSAS) поиск непустого значения..
to cherox

Простите, что позно вмешиваюсь в дискуссию, но вопрос по бизнес стороне проблемы.
У вас периодические цены используются только для показа или еще в последующих вычислениях тоже?

Я сам сталкивался с подобной проблемой, где периодические цены (параметры) использовались для последующих вычислений и только их конечный результат использовался для показа пользователю.

Не знаю с каками размерами таблиц фактов вы имеете дело, но у меня ваш подход не прошел из соображений производительности, так как вычисления надо было применять на листовых уровнях, а результат интересовал аггрегированый. Я пошел по другому пути, а именно - все расчеты на стороне DWH и помещение их в таблицу фактов (у меня порядок десятка милионов в таблице фактов), пользователю показаваются уже аггрегированые меры, посему время отклика минимально (OLAP как ни как, а не Reporting).
...
Рейтинг: 0 / 0
11.02.2005, 08:22
    #32911378
Mosha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написание CM (MSAS) поиск непустого значения..
Dmitry Biryukov LastSales <> LastSales2, хотя, по-моему они одинаковые

Тут я с Вами не согласен - они совсем не одинаковые, а очень даже разные. Самое главное для определения значений формул многомерном пространстве - это координаты. А эти две формулы передвигаут координаты совершенно по разному. Моя формула - сдвигает координату по времени, оставляя координату по measures - тем самым обеспечивая что формула вызовется рекурсивно. Ваша формула, сдвигает measures, тем самым ломая рекурсивность и после этого переклучается на довольно бесполезную формулу Time.PrevMember, которая двигается назад по времени, пока не выпадает за границу куба и возвращает NULL.
Более подробно - во второй редакции Fast track to MDX .

P.S. Тут backfire намекнул в другом thread, что мол я собираю ценную информацию в конфе, а потом печатаю книги и наживаю на этом миллионы. Но поверьте, что эту главу я написал задолго до того как эта тема здесь обсуждалась. Да и проблему как рекурсивно находить LastNonEmptyChild, я впервые решал еще в 1996 году в Панораме, до того как MDX существовал в том виде в каком мы его знаем. И что на выпуске книг можно заработать деньги - так может думать только тот кто сам книг не выпускал. Денег заработать на книге нельзя, ну не считая разве что Harry Potter или там Code DaVinci - но никак на книге про MDX :)

Моша
----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights
...
Рейтинг: 0 / 0
11.02.2005, 17:58
    #32912376
написание CM (MSAS) поиск непустого значения..
MoshaСамое главное для определения значений формул многомерном пространстве - это координаты
Это конечно понятно и безспорно, но если не затруднит может проясните такую вещь. Тут особо указывалось, что при расчете предыдущего надо изобразить
Код: plaintext
1.
with member Measures.LastSales as 'iif(IsEmpty([Measures].[Unit Sales]), Time.PrevMember, [Measures].[Unit Sales])'
и надо царапать Time.PrevMember а не (Time.PrevMember, [Measures].[Unit Sales]), хотя последнее более понятно.
Более того если изобразить
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
with 
member Measures.LastSales as 'iif(IsEmpty([Measures].[Unit Sales]), Time.PrevMember, [Measures].[Unit Sales])'
member Measures.LastSales2 as 'iif(IsEmpty([Measures].[Unit Sales]),(Time.PrevMember, [Measures].[Unit Sales]), [Measures].[Unit Sales])'
member Measures.LastCost as 'iif(IsEmpty([Measures].[Store Cost]), Time.PrevMember, [Measures].[Store Cost])'
member Measures.LastCost2 as 'iif(IsEmpty([Measures].[Store Cost]),(Time.PrevMember, [Measures].[Store Cost]), [Measures].[Store Cost])'
select 
    {[Measures].[Unit Sales], LastSales, LastSales2, [Measures].[Store Cost],Measures.LastCost,Measures.LastCost2} on columns, 
    [Time].[Month].Members on rows
from Sales
то значения выводяться для LastSales то что касается [Measures].[Unit Sales], для LastCost то что касается [Measures].[Store Cost]. Всё правильно...
Так вот вопрос КАК ЭТО ТАК ПРАВИЛЬНО ПОЛУЧАЕТСЯ? Каким таким хитрым образом разруливается что в одном случае по Time.PrevMember берётся [Measures].[Unit Sales], а в другом [Measures].[Store Cost]? Имхо default measure тут не причём. Крутил в разные стороны - ничего не меняется.

Не сочтите за труд. Поясните безтолковому. Ибо от закипающего чердака экран запотевает....
...
Рейтинг: 0 / 0
11.02.2005, 18:15
    #32912405
олапист
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написание CM (MSAS) поиск непустого значения..
Time.PrevMember здесь эквивалентно (Time.PrevMember, Measures.CurrentMember)
а Measures.CurrentMember это по ходу тот calculated member который мы определяем формулой т е LastSales, LastCost, etc
рекурсия, панимаишь!
...
Рейтинг: 0 / 0
11.02.2005, 18:18
    #32912412
Владимир Штепа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написание CM (MSAS) поиск непустого значения..
Mosha
P.S. Тут backfire намекнул в другом thread, что мол я собираю ценную информацию в конфе, а потом печатаю книги и наживаю на этом миллионы. Но поверьте, что эту главу я написал задолго до того как эта тема здесь обсуждалась. Да и проблему как рекурсивно находить LastNonEmptyChild, я впервые решал еще в 1996 году в Панораме, до того как MDX существовал в том виде в каком мы его знаем. И что на выпуске книг можно заработать деньги - так может думать только тот кто сам книг не выпускал. Денег заработать на книге нельзя, ну не считая разве что Harry Potter или там Code DaVinci - но никак на книге про MDX :)


Моша, почтеннейше прошу прощения, если мой юмор в чем то перешел границы приличия. Сожалею, что Вас это чем то задело.
...
Рейтинг: 0 / 0
11.02.2005, 19:40
    #32912515
написание CM (MSAS) поиск непустого значения..
Ага... Понятно. По немногу проясняется. Пасибки.
...
Рейтинг: 0 / 0
11.02.2005, 21:45
    #32912610
Dmitry Biryukov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написание CM (MSAS) поиск непустого значения..
backfireКАК ЭТО ТАК ПРАВИЛЬНО ПОЛУЧАЕТСЯ?
Не сочтите за труд. Поясните безтолковому. Ибо от закипающего чердака экран запотевает....
ну вот и backfire подключился :-)
А я думал я один торможу...

олапистTime.PrevMember здесь эквивалентно (Time.PrevMember, Measures.CurrentMember)совсем не очевидно
смотрите:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
with member Measures.LastSales as 'iif(IsEmpty([Measures].[Unit Sales]),  (Time.PrevMember,Measures.CurrentMember) , [Measures].[Unit Sales])'
member Measures.Time_PrevMember as '(Time.PrevMember,Measures.CurrentMember )'
member Measures.Unit_Sales as '[Measures].[Unit Sales]'
member Measures.LastSales2 as 'iif(IsEmpty([Measures].[Unit Sales]), Time_PrevMember, [Unit_Sales])'
select 
    {[Measures].[Unit Sales], LastSales, Time_PrevMember, Unit_Sales ,  LastSales2} on columns, 
    [Time].[Month].Members on rows
from Sales
...
Рейтинг: 0 / 0
11.02.2005, 22:56
    #32912640
написание CM (MSAS) поиск непустого значения..
Дмитрий! Я так думаю у backfire все в порядке с пониманием. Это не он тормозит, а другие представители э-э-э... ну неважно чего.
...
Рейтинг: 0 / 0
11.02.2005, 23:33
    #32912653
Mosha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
написание CM (MSAS) поиск непустого значения..
Дмитрий - олапист сказал прямо в точку:

олапистTime.PrevMember здесь эквивалентно (Time.PrevMember, Measures.CurrentMember)

Я бы даже уточнил - не только здесь эквивалентно, но и всегда. Ведь если в tuple не указаны все координаты, то их надо откуда-то взять чтобы определить в какой cell мы попадаем. Ну берутся естественно текучие координаты по всем измерениям.
По поводу вашего примера, я уже обьяснил, что меняются разные координаты.

Моша
----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights
...
Рейтинг: 0 / 0
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / написание CM (MSAS) поиск непустого значения.. / 25 сообщений из 42, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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