powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Эмуляция FIRSTchild в Standard редакции
15 сообщений из 15, страница 1 из 1
Эмуляция FIRSTchild в Standard редакции
    #39714613
binro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, подскажите пожалуйста.

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

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

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

Сильно ли просядет производительность?
...
Рейтинг: 0 / 0
Эмуляция FIRSTchild в Standard редакции
    #39714645
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
binro,

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

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

Всё проверяется/тестируется по конкретным сценариям имеющейся архитектуры куба/данных и их свойств.
Так что замена вполне элементарна, без особых выкрутасов.
...
Рейтинг: 0 / 0
Эмуляция FIRSTchild в Standard редакции
    #39714947
binro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vikkiv,

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

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


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



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

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


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

так тоже NULL :
Код: sql
1.
 member x6 as [Календарь].[Год-Месяц-День].[Месяц].&[201708].FirstChild
...
Рейтинг: 0 / 0
Эмуляция FIRSTchild в Standard редакции
    #39715031
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
binro,

хрустальный шар подсказывает что ошибка скорей всего в остальной - невидимой части запроса (или в искомых координатах действительно нет данных)
вот работающий пример из Adventure Works 2014 на первое число каждого месяца 2013-го года
Код: sql
1.
2.
3.
4.
5.
6.
7.
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]
...
Рейтинг: 0 / 0
Эмуляция FIRSTchild в Standard редакции
    #39716072
binro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vikkiv,
Спасибо Вам и хрустальному шару!

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

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

Но вот еще вопрос:
правильно ли я понимаю, что для вычисляемых таким образом мер невозможно построить предагрегаты?
...
Рейтинг: 0 / 0
Эмуляция FIRSTchild в Standard редакции
    #39716241
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
binro,

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

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

есть ещё вариант когда и те и другие берутся из кэша (на основе предыдущих запросов)
...
Рейтинг: 0 / 0
Эмуляция FIRSTchild в Standard редакции
    #39719112
binro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vikkiv,

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

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



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

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

Но вот я ее не нашел. Может, плохо искал?
Или пятью (а при добавлении в измерение еще чего-то - и больше) вложенными IIF-ами определять
, какая иерархия сейчас активна (сравнивать с именем члена на равенство ALL или на пустоту)
- и уже ее подсовывать?
...
Рейтинг: 0 / 0
Эмуляция FIRSTchild в Standard редакции
    #39719125
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
binro,

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

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

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

можно попробовать напрямую атрибут за атрибутом писать так-же снизу вверх по связям между атрибутами
без иерархий через head(exists(..)), хотя для иерархий своё хранилище, не помню уже..
...
Рейтинг: 0 / 0
Эмуляция FIRSTchild в Standard редакции
    #39720107
binro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемый vikkiv,
опять беда :)

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

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
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.

Что же ему не нравится?
...
Рейтинг: 0 / 0
Эмуляция FIRSTchild в Standard редакции
    #39720144
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
binro,

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

1) скобки тупла для одной позиции не обязательны
2) точки с запятой после четвёрки не хватает - хотя судя по "(Ну и вокруг много еще чего, понятно)." - просто потерялось на пути в форум
3) легче всего экспериментировать на Adventure Works (полной или урезанной до пары измерений и групп мер версии с выкинутыми скриптами, в которых так-же и есть примеры)
...
Рейтинг: 0 / 0
Эмуляция FIRSTchild в Standard редакции
    #39720159
binro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vikkiv,

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

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

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

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

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

Но это не к Вам, vikkiv, это "ко всем" :)
...
Рейтинг: 0 / 0
Эмуляция FIRSTchild в Standard редакции
    #39720665
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
binro,

ну мало-ли почему, была эта тема уже несколько раз (в т. ч. переход от LastChild который в Standard помнится работал к First..), да и статей в сети довольно много как это делать, может поэтому никому и не интересно отвечать было, да и рынок MD кубов сжимается понемногу с выходом гибких мощностей облаков, MPP, фреймворков и прочих альтернатив..
...
Рейтинг: 0 / 0
Эмуляция FIRSTchild в Standard редакции
    #39723758
binro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vikkiv,

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

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

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

вот так вот это выглядит :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
			Ост на нач.	 	Ост на конец
	Май, 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.
Все строго по формуле, только формула пока что хромает.
Как в формуле выбрать "первого потомка из выбранных в фильтре"?
...
Рейтинг: 0 / 0
Эмуляция FIRSTchild в Standard редакции
    #39723768
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
binro,

что там что и откуда, какие агрегации/расчёты, где формулы? смешались в кучу люди, кони..
неплохо-бы расписать, т.к. маловероятно кто копаться будет в десятке постов
(а часто и больше - по нескольку страниц).
Всё решаемо, вопрос в организации логики (хоть часто и не так как удобно или хотелось)
С мультиселектом - известная проблема, если идёт в Where - то можно подобрать контекст,
если закопано в From то увы, только с бубном.
...
Рейтинг: 0 / 0
Эмуляция FIRSTchild в Standard редакции
    #39723776
binro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vikkiv,

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

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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 то увы, только с бубном.


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



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

Мультиселект возникает в клиенте (Екселе) - Ексель что, иногда строит запрос с такими фильтрами на уровне From ?
ну допустим, это мы реализовать не стремимся...
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Эмуляция FIRSTchild в Standard редакции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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