Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / OLAP и DWH Новый топик    Ответить
 рассчеты в scoped assignment  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 945
Доброго времени суток.

- есть метрика Revenue, гранулярность день/арена
- есть метрики DisplayAds, VideoAds, гранулярность день/арена/игра/домен
- хочется сделать метрику ModeledRevenue c гранулярностью день/арена/игра/домен
- сначала надо вычислить для арена/день RevenuePerRequest = Revenue / (DisplayAds + VideoAds)
- затем для день/арена/игра/домен ModeledRevenue = (DisplayAds + VideoAds) * RevenuePerRequest

сделал вот такое

CREATE MEMBER CURRENTCUBE.[Measures].[Test Revenue Per Request] AS NULL;
CREATE MEMBER CURRENTCUBE.[Measures].[Test Modeled Revenue] AS NULL;

SCOPE([Dim Calendar].[Calendar YQMD].[Date].Members, [Dim Arena].[Arena Name].Members);
    SCOPE([Measures].[Test Revenue Per Request]);
        THIS = ([Measures].[Revenue]) / ([Measures].[Display Ads] + [Measures].[Video Ads]);
    END SCOPE;

    SCOPE([Test Modeled Revenue], [Dim Domain].[Domain Name].Members, [Dim Content].[Content Name].Members);
        THIS = ([Measures].[Display Ads] + [Measures].[Video Ads]) * ([Measures].[Test Revenue Per Request], ROOT([Dim Content]), ROOT([Dim Domain]));
    END SCOPE;
END SCOPE;


работает, но не совсем:

- если выбрать в качестве измерений дату, арену, то разбивка по игре, домену тоже работает
- если выбрать в качестве измерений только игру, то ничего не работает
- в любом случае Totals'ы не работают

помогите пожалуйста куда копать?

К сообщению приложен файл. Размер - 7Kb
24 фев 18, 00:57    [21214924]     Ответить | Цитировать Сообщить модератору
 Re: рассчеты в scoped assignment  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 945
сделал фэйковые меры в measure group и все поехало.


CREATE MEMBER CURRENTCUBE.[Measures].[Test Rev Per Req] AS NULL;
CREATE MEMBER CURRENTCUBE.[Measures].[Test Modeled Revenue] AS NULL;


SCOPE([Dim Calendar].[Calendar YQMD].[Date].Members, [Dim Arena].[Arena Name].[Arena Name].Members);
SCOPE([Measures].[Test Revenue Per Request]);
THIS = IIF([Measures].[Display Ads] + [Measures].[Video Ads] > 0, ([Measures].[Revenue]) / ([Measures].[Display Ads] + [Measures].[Video Ads]), NULL);
END SCOPE;

SCOPE([Measures].[Test Modeled Revenue], [Dim Domain].[Domain Name].[Domain Name].Members, [Dim Content].[Content Name].[Content Name].Members);
THIS = ([Measures].[Display Ads] + [Measures].[Video Ads]) * ([Measures].[Test Revenue Per Request], ROOT([Dim Content]), ROOT([Dim Domain]));
END SCOPE;
END SCOPE;
24 фев 18, 02:02    [21214953]     Ответить | Цитировать Сообщить модератору
 Re: рассчеты в scoped assignment  [new]
bideveloper
Member

Откуда:
Сообщений: 330
churupaha,

Потому что вычисляемые меры сами собой не агрегируются.
Поэтому либо писать для них в скрипте агрегацию, либо, как вы сделали, создавать фейковые меры.
24 фев 18, 18:07    [21215610]     Ответить | Цитировать Сообщить модератору
 Re: рассчеты в scoped assignment  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 945
bideveloper,

а вы не подскажете, почему подобное может тупить? верно ли я понимаю, что даже в случае если scope assignment применен к реальным мерам, т. е. "переписываю" реальные меры, то как такового переписывания не происходит, просто ассайнится формула и при обращении вычисляется?
14 мар 18, 18:36    [21256660]     Ответить | Цитировать Сообщить модератору
 Re: рассчеты в scoped assignment  [new]
Andy_OLAP
Member

Откуда: я знаю, что Зенит - чемпион
Сообщений: 2199
churupaha
Доброго времени суток.

- есть метрика Revenue, гранулярность день/арена
- есть метрики DisplayAds, VideoAds, гранулярность день/арена/игра/домен
- хочется сделать метрику ModeledRevenue c гранулярностью день/арена/игра/домен
- сначала надо вычислить для арена/день RevenuePerRequest = Revenue / (DisplayAds + VideoAds)
- затем для день/арена/игра/домен ModeledRevenue = (DisplayAds + VideoAds) * RevenuePerRequest

сделал вот такое

SCOPE([Dim Calendar].[Calendar YQMD].[Date].Members, [Dim Arena].[Arena Name].[Arena Name].Members);
SCOPE([Measures].[Test Revenue Per Request]);
THIS = IIF([Measures].[Display Ads] + [Measures].[Video Ads] > 0, ([Measures].[Revenue]) / ([Measures].[Display Ads] + [Measures].[Video Ads]), NULL);
END SCOPE;

SCOPE([Measures].[Test Modeled Revenue], [Dim Domain].[Domain Name].[Domain Name].Members, [Dim Content].[Content Name].[Content Name].Members);
THIS = ([Measures].[Display Ads] + [Measures].[Video Ads]) * ([Measures].[Test Revenue Per Request], ROOT([Dim Content]), ROOT([Dim Domain]));
END SCOPE;
END SCOPE;


Вместо
SCOPE([Dim Calendar].[Calendar YQMD].[Date].Members, [Dim Arena].[Arena Name].[Arena Name].Members);
SCOPE([Measures].[Test Modeled Revenue], [Dim Domain].[Domain Name].[Domain Name].Members, [Dim Content].[Content Name].[Content Name].Members);
THIS = ([Measures].[Display Ads] + [Measures].[Video Ads]) * ([Measures].[Test Revenue Per Request], ROOT([Dim Content]), ROOT([Dim Domain]));
END SCOPE;
END SCOPE;

попробуйте так - сначала идет scope для "Test Revenue Per Request", а затем за ним независимый scope для "Test Modeled Revenue"
SCOPE([Measures].[Test Modeled Revenue],[Dim Calendar].[Calendar YQMD].[Date].Members, [Dim Arena].[Arena Name].[Arena Name].Members);
THIS = ([Measures].[Display Ads] + [Measures].[Video Ads]) * 
aggregate([Dim Domain].[Domain Name].&[All],
aggregate([Dim Content].[Content Name].&[All],
[Measures].[Test Revenue Per Request]))
 );
END SCOPE;

вдруг быстрее пойдет...
14 мар 18, 21:46    [21257006]     Ответить | Цитировать Сообщить модератору
 Re: рассчеты в scoped assignment  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 945
Andy_OLAP,

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

CREATE MEMBER CURRENTCUBE.[Measures].[Revenue Per Video Request] AS
IIF ([Measures].[Video Ads] > 0, [Measures].[Video Revenue] / [Measures].[Video Ads], NULL),
FORMAT_STRING = "$#,##0.000000;($#,##0.000000)",
VISIBLE = 1 ,  DISPLAY_FOLDER = 'Video' ,  ASSOCIATED_MEASURE_GROUP = '01 - Daily - Fact Revenue';

CREATE MEMBER CURRENTCUBE.[Measures].[Revenue Per Display Request] AS
IIF ([Measures].[Display Ads] > 0, [Measures].[Display Revenue] / [Measures].[Display Ads], NULL),
FORMAT_STRING = "$#,##0.000000;($#,##0.000000)",
VISIBLE = 1 ,  DISPLAY_FOLDER = 'Display' ,  ASSOCIATED_MEASURE_GROUP = '01 - Daily - Fact Revenue';


SCOPE([Measures].[Modeled Video Revenue]);
    THIS = [Measures].[Video Ads] * ([Measures].[Revenue Per Video Request], ROOT([Dim Domain]), ROOT([Dim Content]));
    FORMAT_STRING(THIS) = "$#,##0.00;($#,##0.00)";
END SCOPE;
SCOPE([Measures].[Modeled Display Revenue]);
    THIS = [Measures].[Display Ads] * ([Measures].[Revenue Per Display Request], ROOT([Dim Domain]), ROOT([Dim Content]));
    FORMAT_STRING(THIS) = "$#,##0.00;($#,##0.00)";
END SCOPE;
SCOPE([Measures].[Modeled Revenue]);
    THIS = [Measures].[Modeled Video Revenue] + [Measures].[Modeled Display Revenue];
    FORMAT_STRING(THIS) = "$#,##0.00;($#,##0.00)";
END SCOPE;


Всё летает по щелчку мышки. Получается сейчас он рассчитывает только для того что есть в таблице фактов в зависимости от контекста.
19 мар 18, 19:01    [21269413]     Ответить | Цитировать Сообщить модератору
 Re: рассчеты в scoped assignment  [new]
Andy_OLAP
Member

Откуда: я знаю, что Зенит - чемпион
Сообщений: 2199
churupaha
Andy_OLAP,

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

Для scope поверх scope так и есть.
churupaha
Всё летает по щелчку мышки. Получается сейчас он рассчитывает только для того что есть в таблице фактов в зависимости от контекста.

В лучших традициях мудрого еврея из Лениграда Моши Пасуманского. Поздравляю, коллега, Вы стали гуру оптимизации :)
Таки кроме шуток - здорово, что смогли переписать просто и наглядно. За это Вам спасибо скажут те, кто придет Вам на смену в этом проекте через пару-тройку лет.
20 мар 18, 18:53    [21272528]     Ответить | Цитировать Сообщить модератору
Все форумы / OLAP и DWH Ответить