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

Откуда:
Сообщений: 11
Коллеги, подскажите пожалуйста.

Руководство хочет сэкономить известную сумму - на разнице между Enterprise и Standart версиями.
Мигрируем с 2008/R2 на 2017.

Способности этой версии всех заинтересованных лиц устраивают (и про SQL и про OLAP)
, кроме нехватки ряда полуаддитивных мер.
Среди тех, что нам нужна , но которую я не понимаю, как эмулировать - FIRSTchild.

Возможно ли ее эмулировать MDX-запросом?
Если да, то подскажите пожалуйста, как именно, или где посмотреть.

Сильно ли просядет производительность?
8 окт 18, 18:18    [21698488]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция FIRSTchild в Standard редакции  [new]
vikkiv
Member

Откуда: London
Сообщений: 1649
binro,

Фактически Last/FirstChild , First/LastNonEmpty и ByAccount это функции иерархий.
Эмулируется в скрипте запросто - ставишь уровень иерархии (выше листового) / .currentmember и на него .FirstChild
Работает естественно немного медленнее.
Насколько - зависит от структуры куба и тяжести данных, в том числе размера измерений.

Если пользователю нужно в отчёте показать 10 простых строк - то в принципе разницы заметно и не будет,
если там на заднем плане анализ простыней по несколько миллионов ячеек и потом расчёты над ними - то вполне может дополнительно просесть так что будет сильно заметно.

Всё проверяется/тестируется по конкретным сценариям имеющейся архитектуры куба/данных и их свойств.
Так что замена вполне элементарна, без особых выкрутасов.
8 окт 18, 19:17    [21698565]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция FIRSTchild в Standard редакции  [new]
binro
Member

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

Не получается :(

если так (хочу увидеть этот самый текущий элемент)
 member x3 as [Календарь].[Год-Месяц-День].currentmember

или так
 member x4 as [Календарь].[Год-Месяц-День].currentmember.FirstChild


то возвращает NULL

если пишу так:
 member x1 as [Календарь].[Год-Месяц-День].[Месяц].currentmember

то получаю
"Функция CURRENTMEMBER ожидает для аргумента 1 выражение иерархии. Было использовано выражение элемента."
Ну это хоть ожидаемо, - но почему в предыдущем случае NULL ?

так тоже NULL :
 member x6 as [Календарь].[Год-Месяц-День].[Месяц].&[201708].FirstChild
9 окт 18, 15:00    [21699361]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция FIRSTchild в Standard редакции  [new]
vikkiv
Member

Откуда: London
Сообщений: 1649
binro,

хрустальный шар подсказывает что ошибка скорей всего в остальной - невидимой части запроса (или в искомых координатах действительно нет данных)
вот работающий пример из Adventure Works 2014 на первое число каждого месяца 2013-го года
with member[Measures].[x1]as[Date].[Calendar].firstchild.member_name
member[Measures].[x2]as([Date].[Calendar].firstchild,
	[Measures].[Internet Order Quantity])
select{[Measures].[x1],[Measures].[x2]}on 0,
descendants([Date].[Calendar].[Calendar Year].&[2013],
	[Date].[Calendar].[Month],SELF)
on 1from[Adventure Works]
9 окт 18, 17:03    [21699501]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция FIRSTchild в Standard редакции  [new]
binro
Member

Откуда:
Сообщений: 11
vikkiv,
Спасибо Вам и хрустальному шару!

Все заработало.

В моем примере не хватало вызова member_name, и в итоге NULL сбивал с толку
, и мне казалось , что "ничего не работает" :)
В невидимой части запроса было все нормально.
--

Но вот еще вопрос:
правильно ли я понимаю, что для вычисляемых таким образом мер невозможно построить предагрегаты?
11 окт 18, 12:51    [21701487]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция FIRSTchild в Standard редакции  [new]
vikkiv
Member

Откуда: London
Сообщений: 1649
binro,

верно, вычисляемые меры вычисляются во время выполнения запроса,
в то время как материальные - просто считываются (из агрегаций или партиций с данными)

вычисляемые меры обычно рассчитываются на основе материальных мер
(хотя смотря что считать, можно материальные вообще не привлекать)

есть ещё вариант когда и те и другие берутся из кэша (на основе предыдущих запросов)
11 окт 18, 16:25    [21701766]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция FIRSTchild в Standard редакции  [new]
binro
Member

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

Может, еще поможете?

вот пока что получилось :
member FstCurrRest_2 as ( R_e, iif(ISLEAF([Календарь].[Год-Месяц-День].currentmember)
		, [Календарь].[Год-Месяц-День].prevmember
		, [Календарь].[Год-Месяц-День].prevmember.LastChild) )


НО!
ведь иерархий то в измерении - несколько!
И оказывается, что для других иерархий это уже не срабатывает
, что, собственно, ожидаемо, - т.к. она тут указана явно.

Если бы вместо [Год-Месяц-День] была бы функция CurrentHierarhy - то , видимо, вопрос бы решился :)

Но вот я ее не нашел. Может, плохо искал?
Или пятью (а при добавлении в измерение еще чего-то - и больше) вложенными IIF-ами определять
, какая иерархия сейчас активна (сравнивать с именем члена на равенство ALL или на пустоту)
- и уже ее подсовывать?
вчера, 21:23    [21707182]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция FIRSTchild в Standard редакции  [new]
vikkiv
Member

Откуда: London
Сообщений: 1649
binro,

такого действительно нет, но иерархии состоят из одноуровневых (сам-себе иерархия) атрибутов (часто из одних и тех-же)

делай scope и в снизу вверх по пирамиде иерархии прописывай уровень за уровнем параллельно для каждой иерархии
отдельно (при том что на остальные иерархии в scope ставить [All] чтобы переназначение их не трогало)
иначе если порядок нарушить то freeze придётся использовать, что не рекомендуется,
ну в общем чтобы вытаскивать правильно назначенные (прописанные) элементы более низкого уровня

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

можно попробовать напрямую атрибут за атрибутом писать так-же снизу вверх по связям между атрибутами
без иерархий через head(exists(..)), хотя для иерархий своё хранилище, не помню уже..
вчера, 22:14    [21707213]     Ответить | Цитировать Сообщить модератору
Все форумы / OLAP и DWH Ответить