powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / как создать меру SumLast30days
14 сообщений из 14, страница 1 из 1
как создать меру SumLast30days
    #39605665
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пусть есть мера M для нее нужно создать меру - сумма за последние 30 дней по всем клиентам, так чтобы она не сплитилась по клиентам потом, а всегда имела такое значение - сумма за последние 30 дней по всем клиента.

Если делать так

MEMBER [Measures].[M (last 30 days) TEST] AS AGGREGATE([Last 30 Days], [Measures].[M]) + AGGREGATE([Last 30 Days], [Measures].[M])

то она сплитится в зависимости от контекста
...
Рейтинг: 0 / 0
как создать меру SumLast30days
    #39605676
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lord BritishПусть есть мера M для нее нужно создать меру - сумма за последние 30 дней по всем клиентам, так чтобы она не сплитилась по клиентам потом, а всегда имела такое значение - сумма за последние 30 дней по всем клиента.

Если делать так

MEMBER [Measures].[M (last 30 days) TEST] AS AGGREGATE([Last 30 Days], [Measures].[M]) + AGGREGATE([Last 30 Days], [Measures].[M])

то она сплитится в зависимости от контекста

MEMBER [Measures].[M (last 30 days) TEST] AS AGGREGATE([Last 30 Days], ROOT([Измерение_клиентов]), [Measures].[M])
...
Рейтинг: 0 / 0
как создать меру SumLast30days
    #39605800
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAPLord BritishПусть есть мера M для нее нужно создать меру - сумма за последние 30 дней по всем клиентам, так чтобы она не сплитилась по клиентам потом, а всегда имела такое значение - сумма за последние 30 дней по всем клиента.

Если делать так

MEMBER [Measures].[M (last 30 days) TEST] AS AGGREGATE([Last 30 Days], [Measures].[M]) + AGGREGATE([Last 30 Days], [Measures].[M])

то она сплитится в зависимости от контекста

MEMBER [Measures].[M (last 30 days) TEST] AS AGGREGATE([Last 30 Days], ROOT([Измерение_клиентов]), [Measures].[M])

огромное вам спасибо! то что надо.
...
Рейтинг: 0 / 0
как создать меру SumLast30days
    #39606011
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините пожалуйста за нубские вопросы. В продолжение этой темы.

Сейчас вот так (просто сумма за 30 дней)
MEMBER [Measures].[M (last 30 days) TEST] AS AGGREGATE([Last 30 Days] * ROOT([Dim Client]) * ROOT([Dim Profile]) , [Measures].[M])

Measure M:

Dim Profile
Dim Client


А как сделать так:
1) сагрегировать M по [Dim Profile] за последние 30 дней
2) и в [M (last 30 days) TEST] обрать только те (1) которые больше 1000?
...
Рейтинг: 0 / 0
как создать меру SumLast30days
    #39606092
bideveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lord British,

1) x = сагрегировать M по ROOT([Dim Profile]) за последние 30 дней
2) scope( Filter([Dim Client].[Dim Client].[Dim Client].members, x <= 1000), x)
this = null
end scope
3) [M (last 30 days) TEST] = сагрегировать x по ROOT([Dim Client])
...
Рейтинг: 0 / 0
как создать меру SumLast30days
    #39606094
bideveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поправка
3) [M (last 30 days) TEST] = сагрегировать x по [Dim Client].[Dim Client].[Dim Client].members
...
Рейтинг: 0 / 0
как создать меру SumLast30days
    #39606372
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bideveloperLord British,

1) x = сагрегировать M по ROOT([Dim Profile]) за последние 30 дней
2) scope( Filter([Dim Client].[Dim Client].[Dim Client].members, x <= 1000), x)
this = null
end scope
3) [M (last 30 days) TEST] = сагрегировать x по ROOT([Dim Client])
Не надо так. Моша категорически не рекомендует filter.
Делайте sum(измерение.элементы, iif (условие, x, null) ), так будет кошерно.
...
Рейтинг: 0 / 0
как создать меру SumLast30days
    #39606389
bideveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAP Моша категорически не рекомендует filter.

Не напомните ссылку, где он такое писал?
А может с тех пор уже что изменилось в SSAS или на это надежды нет? )
...
Рейтинг: 0 / 0
как создать меру SumLast30days
    #39606390
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bideveloperAndy_OLAP Моша категорически не рекомендует filter.

Не напомните ссылку, где он такое писал?
А может с тех пор уже что изменилось в SSAS или на это надежды нет? )
Вот тут примерно про filter в сравнении с condition. Весьма показательно.
А с тех пор многое поменялось - он переместился сначала в команду bing, а потом вовсе в гугл ушел.
...
Рейтинг: 0 / 0
как создать меру SumLast30days
    #39606411
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAPНе надо так. Моша категорически не рекомендует filter.
Делайте sum(измерение.элементы, iif (условие, x, null) ), так будет кошерно.вроде ведь не будет лучше, sum(filter(set,condition),measure) и sum(set,iif(condition,measure,null)) дают не существенно различающиеся результаты на последних версиях (2016/2017, в то время как Моша писал о 2005/2008), более того второй вариант (который с iif) примерно на 5% медленнее чем первый вариант (с filter), {оба всё равно работают в cell-by-cell, считая более 2 млн. ячеек}

некоторая заметная разница будет только в случае если меру с логикой выносить за сумму, т.е. сначала определить меру X_1 как iif(condition,measure,null) а потом уже делать sum(set,X_1)

проверялось на таких запросах:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with
--member [Measures].[DD] as iif([Measures].[Internet Order Quantity]>2,[Measures].[Internet Order Quantity],null)
member [Measures].[FF] as
aggregate(filter([Product].[Product].[Product]*[Date].[Date].[Date],[Measures].[Internet Order Quantity]>2),[Measures].[Internet Order Quantity])
--aggregate([Product].[Product].[Product]*[Date].[Date].[Date],iif([Measures].[Internet Order Quantity]>2,[Measures].[Internet Order Quantity],null)) -- fail/calculated member
--sum(filter([Product].[Product].[Product]*[Date].[Date].[Date],[Measures].[Internet Order Quantity]>2),[Measures].[Internet Order Quantity])
--sum([Product].[Product].[Product]*[Date].[Date].[Date],[Measures].[DD])
--sum([Product].[Product].[Product]*[Date].[Date].[Date],iif([Measures].[Internet Order Quantity]>2,[Measures].[Internet Order Quantity],0))
--sum([Product].[Product].[Product]*[Date].[Date].[Date],iif([Measures].[Internet Order Quantity]>2,[Measures].[Internet Order Quantity],null))
select [Measures].[FF] on 0 from [Adventure Works]
...
Рейтинг: 0 / 0
как создать меру SumLast30days
    #39606422
bideveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vikkivнекоторая заметная разница будет только в случае если меру с логикой выносить за сумму, т.е. сначала определить меру X_1 как iif(condition,measure,null) а потом уже делать sum(set,X_1)

Не понял этого момента. Это будет более оптимально? За счет чего здесь будет разница с sum(set,iif(condition,measure,null))?
...
Рейтинг: 0 / 0
как создать меру SumLast30days
    #39606426
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vikkivесли меру с логикой выносить за сумму, т.е. сначала определить меру X_1 как iif(condition,measure,null) а потом уже делать sum(set,X_1)

А всегда так. Потому как обычно куча формул бывает, sum, avg и прочий комплект поверх X_1. И к тому же measure под X_1 может быть distinct count.
Мне просто лень было этот момент подробно расписывать. Спасибо, Вы это уточнили для коллег и хороший пример привели для тестовой Adventure Works.
...
Рейтинг: 0 / 0
как создать меру SumLast30days
    #39606437
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
некоторое улучшение производительности скорее всего связанно с тем как агрегирующие функции работают с null (что у Моши описанно в части {1}) - хоть для самой меры на set расчёт всё равно производится для каждой ячейки но пофакту обьём {лёгких} расчётов падает с вынесенной мерой (с незначительным снижением cells calculated но увеличением запросов к SE)

кроме того если вынести и определить set отдельно то получим дополнительное улучшение (ещё несколько процентов) - хотя для ТС это почти без разницы т.к. реализуется на уровне MDX Script, т.е. scope (можно конечно динамический hidden set сделать, но придётся решать вопрос с неопределённостью о том какие атрубуты туда попадут)

а если ещё и в ручную применить к этому set (отдельного или внутри filter) - nonempty, то производительность вырастит в 25~60 раз (reduce computational size для/over sum {set уменьшен в 90 раз, количество подсчитанных ячеек в 320 раз} о чём Моша пишет в части {2} - но как раз наоборот из-за того что в нашем случае всё равно cell-by-cell, на существенно меньшем наборе)

это к тому что описанные оптимизации может и работают {-ли на предыдущих версиях} но относятся к частным случаям и не стоит их слепо применять как общий подход к каждой глобальной проблеме т.к. всё дело в деталях (а они часто теряются в процессе интерпретации).
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
with
member [Measures].[DD] as iif([Measures].[Internet Order Quantity]>2,[Measures].[Internet Order Quantity],null)
set [AA] AS nonempty({[Product].[Product].[Product]*[Date].[Date].[Date]},[Measures].[DD])
member [Measures].[FF] as
--sum(filter([AA],[Measures].[Internet Order Quantity]>2),[Measures].[Internet Order Quantity])
sum([AA],[Measures].[DD])
--sum([AA],iif([Measures].[Internet Order Quantity]>2,[Measures].[Internet Order Quantity],0))
select [Measures].[FF] on 0 from [Adventure Works]
...
Рейтинг: 0 / 0
как создать меру SumLast30days
    #39606502
bideveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ясно, спасибо, буду знать )
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / как создать меру SumLast30days
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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