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

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

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

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

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

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

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

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

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

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

Откуда:
Сообщений: 17
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
Сообщений: 1706
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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

можно попробовать напрямую атрибут за атрибутом писать так-же снизу вверх по связям между атрибутами
без иерархий через head(exists(..)), хотя для иерархий своё хранилище, не помню уже..
17 окт 18, 22:14    [21707213]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция FIRSTchild в Standard редакции  [new]
binro
Member

Откуда:
Сообщений: 17
Уважаемый vikkiv,
опять беда :)

Вроде разобрался , как и что надо вписывать
, посмотрел, как обращение к элементам зависит от выбранной иерархии/фильтра
, как это работает в окне запросов, и собрался уже смотреть в кубе...
, но вот не получается вписать :(

А именно :
Вот такое в Calculate ( в режиме Script View ) вписывается нормально (два мембера чисто для иллюстрации) :

CREATE MEMBER CURRENTCUBE.[Measures].[X4]
 AS 4, 
VISIBLE = 1;             

/*
scope ([Measures].[X4]);

    scope ([Календарь].[Дата]);
        THIS = 2 ;
    end scope;

    scope ([Календарь].[Дата].[Дата]);
        THIS = 3 ;
    end scope;

    scope ([Календарь].[Месяцы]);
        THIS  = 4
    end scope;

end scope;
*/

CREATE MEMBER CURRENTCUBE.[Measures].[X5]
 AS 5, 
VISIBLE = 1;             

(Ну и вокруг много еще чего, понятно).

а если откомментировать участок со скоупами, - то выдает синтаксическую ошибку.

подчеркивает - первое же слово SCOPE.

Что же ему не нравится?
19 окт 18, 17:35    [21709392]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция FIRSTchild в Standard редакции  [new]
vikkiv
Member

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

в принципе Visual Studio проверка не всегда правильно работает
(т.е. обращает внимание на в принципе правильные конструкции, иногда не распознаёт неправильные),
я часто подчёркивания игнорирую, в подавляющем большинстве случаев всё прекрасно работает
(стоит просто выгрузить на сервер, если не грузит на сервер - то да, нужно копать),
но бывает действительно серьёзные ошибки/описки помогает найти..

1) скобки тупла для одной позиции не обязательны
2) точки с запятой после четвёрки не хватает - хотя судя по "(Ну и вокруг много еще чего, понятно)." - просто потерялось на пути в форум
3) легче всего экспериментировать на Adventure Works (полной или урезанной до пары измерений и групп мер версии с выкинутыми скриптами, в которых так-же и есть примеры)
19 окт 18, 19:15    [21709480]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция FIRSTchild в Standard редакции  [new]
binro
Member

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

Вот уж точно, как говорится - незамыленный взгляд!

Именно п.2. !
(ничего не потерялось. я именно дословно все скопипастил с обрамлением
, и оказалось - не зря :) )
Огромное спасибо!

Ну а дальше, - да, подсвечивает не ошибки, а непонятно что...
Это-то знакомо, так что чисто на "подсветку" я бы и не жаловался
, дело в том, что именно "не грузил на сервер", - я это пробовал
, я не останавливался на "ах, он мне подчеркнул!... Что же теперь делать!?..." :)

--
P.S.
Но вот что мне стало "вдруг" интересно:

а что, неужели, при неоднократном упоминании отличий версии STD от ENTERPR
, - реально никто не эмулировал FirstChild на урезанной версии?
- я сужу по кол-ву откликов на мой топик.

Но это не к Вам, vikkiv, это "ко всем" :)
19 окт 18, 20:51    [21709539]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция FIRSTchild в Standard редакции  [new]
vikkiv
Member

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

ну мало-ли почему, была эта тема уже несколько раз (в т. ч. переход от LastChild который в Standard помнится работал к First..), да и статей в сети довольно много как это делать, может поэтому никому и не интересно отвечать было, да и рынок MD кубов сжимается понемногу с выходом гибких мощностей облаков, MPP, фреймворков и прочих альтернатив..
22 окт 18, 04:55    [21710630]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция FIRSTchild в Standard редакции  [new]
binro
Member

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

получилось почти все :) Но не все :(

Не понятно, как обработать ситуацию, когда в фильтре выбрано несколько дочерних элементов в разных родителях
, и выводятся результаты с промежуточными итогами.
Например: "по нескольку дней в каждом месяце", и смотрим итоги помесячно.

В этом случае цепляется мера из последнего дня предыдущего месяца, а не предыдущего по отношению к первому выбранному в этом месяце дню.

вот так вот это выглядит :
			Ост на нач.	 	Ост на конец
Май, 31 305 198 6 371
Май Итог 351 081 6 371
Июнь Июн, 13 1 862 1 869
Июн, 14 1 869 1 869
Июн, 15 1 869 1 865
Июнь Итог 6 371 1 865

Итог за июнь берется не зеленое 1862, а голубое 6371.
Все строго по формуле, только формула пока что хромает.
Как в формуле выбрать "первого потомка из выбранных в фильтре"?
26 окт 18, 19:16    [21716529]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция FIRSTchild в Standard редакции  [new]
vikkiv
Member

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

что там что и откуда, какие агрегации/расчёты, где формулы? смешались в кучу люди, кони..
неплохо-бы расписать, т.к. маловероятно кто копаться будет в десятке постов
(а часто и больше - по нескольку страниц).
Всё решаемо, вопрос в организации логики (хоть часто и не так как удобно или хотелось)
С мультиселектом - известная проблема, если идёт в Where - то можно подобрать контекст,
если закопано в From то увы, только с бубном.
26 окт 18, 20:06    [21716551]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция FIRSTchild в Standard редакции  [new]
binro
Member

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

Так проблема не в том, что я не понимаю , как работает то, что я накропал :)
Проблема в том, что я не знаю, как сделать то, что я пока не умею :(

Формула-то вот:

scope ([Measures].[Ост нач]);
    scope ([Календарь].[Дата].members);
        THIS=( [Measures].[Остаток на конец]
             , [Календарь].[Дата].prevmember
             );
    end scope;
    scope ([Календарь].[Месяцы].members);
        THIS=( [Measures].[Остаток на конец]
             , [Календарь].[Месяцы].prevmember
             );
    end scope;

    scope ([Календарь].[Год-Месяц-День].members);            
        THIS = ([Measures].[Остаток на конец]
            , [Календарь].[Год-Месяц-День].PrevMember
    );
    end scope;            
end scope;

В тех скоупах, что в ней вписаны, - она меня устраивает и мне вроде все понятно.
Спасибо за инструкции :)

А что надо сделать для этого :
vikkiv
С мультиселектом - известная проблема, если идёт в Where - то можно подобрать контекст,
если закопано в From то увы, только с бубном.


Нашел тут на эту тему вот такие подсказки:
create dynamic set currentcube.[Set_of_Days_without_Hierarchy] AS existing [Дата].[День].[День];


Но еще не успел это опробовать. Не понимаю пока, что дальше с этим набором делать.
Так вычисляется набор выбранных в фильтре дней и его надо засунуть в THIS ?

Мультиселект возникает в клиенте (Екселе) - Ексель что, иногда строит запрос с такими фильтрами на уровне From ?
ну допустим, это мы реализовать не стремимся...
26 окт 18, 20:27    [21716565]     Ответить | Цитировать Сообщить модератору
Все форумы / OLAP и DWH Ответить