Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / OLAP и DWH Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Пробелы в фундаментальных знаниях? MDX Scope...  [new]
sese
Member

Откуда: маськва
Сообщений: 78
Други, есть условная мера Value с типом агрегации "сумма" и на порезанных помесячно партициях стоит общий хинт Slice вида

<Slice>[Дата].[Год].&[2016]</Slice>

Выбираем с сводной таблице эксель период и меру Value. И в профайлере видим, что читаются только партиции того года, которому принадлежит выбранный в экселе период.
Все хорошо.


Теперь есть мера Value2 с типом агрегации LastChild.
Пишу скоуп...

scope(
[Дата].[Год].&[2018],
[Дата].[День].[День],
Measures.[Value2]
);
this =
SUM(
(
{
[Дата].[День].&[20180101]
:
[Дата].[День].CurrentMember
}
),
measures.[Value]
);
end scope;


... и попадаю на скан всех партиций за все годы. Почему так? В измерении времени, разумеется, иерархия "год-месяц-день" построена и все связи проставлены.
Что я делаю не так?
14 май 18, 13:23    [21407969]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
bideveloper
Member

Откуда:
Сообщений: 357
Не совсем в тему вопрос, но почему scope задаете не по листьям, а по всем элементам 2018 года?
14 май 18, 22:53    [21409479]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
Ferdipux
Member

Откуда: Москва
Сообщений: 467
sese
... и попадаю на скан всех партиций за все годы. Почему так? В измерении времени, разумеется, иерархия "год-месяц-день" построена и все связи проставлены.
Что я делаю не так?


Было похожее, только без scope. Вылечилось установкой rigid связей в измерении времени.
15 май 18, 07:48    [21409687]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
sese
Member

Откуда: маськва
Сообщений: 78
bideveloper,

прошу простить, но как это - не по листьям? Я как раз явно пишу: [Дата].[День].[День],

А год в моем скромном представлении призван лишь ограничить набор этих листьев. Нет?
15 май 18, 09:02    [21409785]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
sese
Member

Откуда: маськва
Сообщений: 78
Ferdipux,

Cоррьки, но мимо. не поленился заглянуть - все rigid.
Да и было бы странно задавать иначе: дни-то между месяцами и годами не перемещаются =)
15 май 18, 09:05    [21409796]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
sese
Member

Откуда: маськва
Сообщений: 78
bideveloper,

И потом, год нужен для того, чтобы определить отправную точку - дату, от которой и вычисляется LastChild, которое отражает состояние на любой момент времени. В данном случае эта отправная дата - 2018-01-01. Для другого года будет другой скоуп и другая дата. Обычно более 3-4 лет в кубе не держа, так что слишком большого числа скоупов не будет. И кстати, именно поэтому на партициях я указал год, а не месяц. Мне все равно нужно читать год.
15 май 18, 09:09    [21409810]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
sese
Member

Откуда: маськва
Сообщений: 78
Update:

а походу скоуп не при делах: убрал скоуп , чтобы посмотреть на поведение самого ласт чайлда. и вот он, зараза, плюет с высокой колокольни на указания на партициях и читает всю историю.
а что мы знаем про ласт чайлд? может пропертю какую установить?
15 май 18, 09:31    [21409843]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 2676
sese
Update:

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

Мы знаем про last-child, что он отрабатывает на уровни иерархии. Для 2018-го берется декабрь 2018, для декабря 2018 берется 31 декабря 2018 (или последняя реальная дата).
Поэтому [Дата].[День].[День] last-child будет идти вверх сразу до [Дата].[День].[All], а вот для иерархии [Дата].[Год-Месяц-День].[День] уже все будет выходить вверх до месяца, а тот до нужного года.
Но и тут нельзя 2018 год засовывать в Scope, а нужно переопределять условие iif(год(Дата.Год-Месяц-День.CurrentMember) это 2018, тогда первое условие, иначе второе условие).

Не стал подробно расписывать, но общую мысль таки уловили, коллега?
15 май 18, 11:49    [21410262]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2115
sese,

а сам запрос-то где? от него тоже многое зависит
15 май 18, 11:56    [21410277]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 2676
ShIgor
sese,

а сам запрос-то где? от него тоже многое зависит

Так он выбирает в Excel мультиселект набор по разным датам или месяцам. Для простого Value с типом SUM все идет корректно, какие выбрал - те секции и читаются.
А вот для общего итога при мультиселекте для value2 получается ерунда. Читаются все секции.

Вывод - не делать физическую measure, а писать составную формулу, которая учитывает то, что будет выбран не единый уровень по измерению Дата - год, месяц, квартал, неделя, день, а несколько вариантов галочками.
И в таком случае искать из выбранных последний день и для него определять Value2 как last-child из Value.
15 май 18, 12:09    [21410313]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2115
Andy_OLAP
ShIgor
sese,

а сам запрос-то где? от него тоже многое зависит

Так он выбирает в Excel мультиселект набор по разным датам или месяцам...

из чего такой вывод?
15 май 18, 12:13    [21410330]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 2676
ShIgor
Andy_OLAP
пропущено...

Так он выбирает в Excel мультиселект набор по разным датам или месяцам...

из чего такой вывод?

Ой-вей, такой вывод из того, что я читаю у него в голове, что он хочет увидеть и что видит на мониторе. Некоторые называют это старостью, некоторые опытом...
15 май 18, 12:18    [21410344]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
sese
Member

Откуда: маськва
Сообщений: 78
Andy_OLAP,

То есть предполагалось написать так:

scope([Дата].[Год - Месяц - День].[День], Measures.[Кол-во SKU]);
this =
SUM(
    (
        {
            iif(
                [Дата].[Год - Месяц - День].CurrentMember.Parent.Parent is [Дата].[Год - Месяц - День].[Год].&[2018],
                [Дата].[Год - Месяц - День].[День].&[20180101],
                [Дата].[Год - Месяц - День].[День].&[20170101]
            )
            :
            [Дата].[Год - Месяц - День].CurrentMember
        }
    ),
    measures.[Value]
);
this = iif( Measures.[Кол-во SKU] <> 0, Measures.[Кол-во SKU], null);
end scope;


?

Если так, то мертвому припарки (соррьки за формат и в кубе у меня только 2 года, 2017 и 2018) :

Query BeginSELECT NON EMPTY Hierarchize({DrilldownLevel({[АВС Сегмент Товара].[АВС Сегмент Товара].[All]}INCLUDE_CALC_MEMBERS)}) DIMENSION PROPERTIES PARENT_UNIQUE_NAMEHIERARCHY_UNIQUE_NAME[АВС Сегмент Товара].[АВС Сегмент Товара].[АВС Сегмент Товара] ON COLUMNS FROM [Куб истории номенклатуры] WHERE ([Дата].[Год - Месяц - День].[Месяц].&[201703][Measures].[Кол-во SKU]) CELL PROPERTIES VALUE FORMAT_STRING LANGUAGE BACK_COLOR FORE_COLOR FONT_FLAGS
Progress Report BeginНачалось чтение данных секции "201701".
Progress Report BeginНачалось чтение данных секции "201702".
Progress Report BeginНачалось чтение данных секции "201703".
Progress Report BeginНачалось чтение данных секции "201704".
Progress Report EndЧтение данных секции "201702" завершено.
Progress Report BeginНачалось чтение данных секции "201705".
Progress Report BeginНачалось чтение данных секции "201706".
Progress Report EndЧтение данных секции "201703" завершено.
Progress Report BeginНачалось чтение данных секции "201707".
Progress Report BeginНачалось чтение данных секции "201708".
Progress Report BeginНачалось чтение данных секции "201709".
Progress Report BeginНачалось чтение данных секции "201710".
Progress Report BeginНачалось чтение данных секции "201711".
Progress Report EndЧтение данных секции "201701" завершено.
Progress Report EndЧтение данных секции "201704" завершено.
Progress Report BeginНачалось чтение данных секции "201712".
Progress Report BeginНачалось чтение данных секции "201801".
Progress Report EndЧтение данных секции "201706" завершено.
Progress Report EndЧтение данных секции "201705" завершено.
Progress Report EndЧтение данных секции "201707" завершено.
Progress Report BeginНачалось чтение данных секции "201802".
Progress Report BeginНачалось чтение данных секции "201803".
Progress Report BeginНачалось чтение данных секции "201804".
Progress Report BeginНачалось чтение данных секции "201805".
Progress Report EndЧтение данных секции "201708" завершено.
Progress Report EndЧтение данных секции "201709" завершено.
Progress Report EndЧтение данных секции "201710" завершено.
Progress Report EndЧтение данных секции "201712" завершено.
Progress Report EndЧтение данных секции "201711" завершено.
Progress Report EndЧтение данных секции "201805" завершено.
Progress Report EndЧтение данных секции "201803" завершено.
Progress Report EndЧтение данных секции "201802" завершено.
Progress Report EndЧтение данных секции "201801" завершено.
Progress Report EndЧтение данных секции "201804" завершено.
Query EndSELECT NON EMPTY Hierarchize({DrilldownLevel({[АВС Сегмент Товара].[АВС Сегмент Товара].[All]}INCLUDE_CALC_MEMBERS)}) DIMENSION PROPERTIES PARENT_UNIQUE_NAMEHIERARCHY_UNIQUE_NAME[АВС Сегмент Товара].[АВС Сегмент Товара].[АВС Сегмент Товара] ON COLUMNS FROM [Куб истории номенклатуры] WHERE ([Дата].[Год - Месяц - День].[Месяц].&[201703][Measures].[Кол-во SKU]) CELL PROPERTIES VALUE FORMAT_STRING LANGUAGE BACK_COLOR FORE_COLOR FONT_FLAGS
15 май 18, 12:40    [21410407]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
sese
Member

Откуда: маськва
Сообщений: 78
Andy_OLAP,


автор
Вывод - не делать физическую measure, а писать составную формулу, которая учитывает то, что будет выбран не единый уровень по измерению Дата - год, месяц, квартал, неделя, день, а несколько вариантов галочками.
И в таком случае искать из выбранных последний день и для него определять Value2 как last-child из Value.



Я в свое время пошел было путем вычисляемой меры, но как раз не смог обработать мультиселект и потому на годы забросил, поскольку все решалось физической мерой =)
15 май 18, 12:45    [21410417]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 2676
sese
Andy_OLAP,


автор
Вывод - не делать физическую measure, а писать составную формулу, которая учитывает то, что будет выбран не единый уровень по измерению Дата - год, месяц, квартал, неделя, день, а несколько вариантов галочками.
И в таком случае искать из выбранных последний день и для него определять Value2 как last-child из Value.



Я в свое время пошел было путем вычисляемой меры, но как раз не смог обработать мультиселект и потому на годы забросил, поскольку все решалось физической мерой =)

Таки да - вот Вы и пришли к варианту, когда не все решается физической мерой. И нужно обрабатывать мультиселект.
15 май 18, 12:49    [21410425]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
sese
Member

Откуда: маськва
Сообщений: 78
Andy_OLAP,

автор
Таки да - вот Вы и пришли к варианту, когда не все решается физической мерой. И нужно обрабатывать мультиселект.


Соррьки, не уловил мысли: то есть мои попытки с физической мерой и скоупом ограничиться только чтением нужной области обречены?
15 май 18, 12:55    [21410446]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2115
sese,

ну так что получается, никакого мультиселескта в запросе нет.
тогда второй вопрос - сколько записей в секции?
помнится мне, что начиная с 2008r2 необходимость явного указания слайса для секции не обязательно.
ssas сам это вычисляет (худо-бедно, о результатах этих оптимизаций пока не говорим).
так вот, в настройка есть порог в количество записей на секцию, когда он точно не вычисляется и, более того, при установке слайсов руками они не задействуются, конечно порожек по-умолчанию маловат (4096), но вдруг?
15 май 18, 13:39    [21410611]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
sese
Member

Откуда: маськва
Сообщений: 78
ShIgor,

ну, год 2017-й - это примерно 350 млн записей. При том там на каждую смену состояния две записи: старая с минусом и новая с плюсом. По месяцам наверное более-менее равномерно и даже начальное состояние всех СКЮ на первое января наверное компенсируется потом каникулами и наверное в январе не больше записей, чем во всех остальных месяцах. В ноябре-декабре только слегка побольше, а так равномерно. То есть грубо, по 20 млн в мес.
15 май 18, 13:43    [21410632]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
sese
Member

Откуда: маськва
Сообщений: 78
ShIgor,

К СОСТОЯНИЮ сложно сделать мультиселект по времени. Вернее, механически-то проще простого, но смысл-то какой?
15 май 18, 13:46    [21410651]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
sese
Member

Откуда: маськва
Сообщений: 78
ShIgor,


автор
в настройка есть порог в количество записей на секцию



В настройках чего? Группы мер? Покопался - пока не нашел. Проекта в целом?
15 май 18, 13:53    [21410669]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2115
sese,

в настройках SSAS, но раз там в секции 20 лям (это по всем листьям, не в исходнике надеюсь?), то не поможет!
15 май 18, 15:19    [21410927]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
sese
Member

Откуда: маськва
Сообщений: 78
Andy_OLAP,

автор

Вывод - не делать физическую measure, а писать составную формулу, которая учитывает то, что будет выбран не единый уровень по измерению Дата - год, месяц, квартал, неделя, день, а несколько вариантов галочками.
И в таком случае искать из выбранных последний день и для него определять Value2 как last-child из Value.


Подсказочку бы...
А то вот переписал без физической меры, но не добился ничего. Такой же скан всей истории


create calculated member currentcube.Measures.[Кол-во SKU 2] as 
sum(
    {
        LinkMember(tail(existing [Дата].[День].[День]).Item(0),[Дата].[Год - Месяц - День]).Parent.Parent.FirstChild.FirstChild
        :
        LinkMember(tail(existing [Дата].[День].[День]).Item(0),[Дата].[Год - Месяц - День])
    },
    Measures.[Value]
    )
15 май 18, 15:46    [21411000]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
sese
Member

Откуда: маськва
Сообщений: 78
ShIgor,


автор
это по всем листьям, не в исходнике надеюсь?


Прошу простить, я не совсем понял, по каким всем листьям.
20 лямов - это результат того select-а, который задан в <QueryDefinition>
15 май 18, 15:50    [21411020]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2115
sese,

тогда если это все сворачивается меньше чем в 4096 строк, то посмотрите настройку IndexBuildThreshold в msmdsrv.ini

а вообще тема древняя и мало что изменилось с того времени (тут)

Кстати, Моша в статье Get most out of partition slices в разделе Related attribites так и пишет: "FE (formula engine) does coordinate decoding lazily, only if it really needs to" и дальше объясняет, что если слайс = Год, но CurrentMember этого атрибута в запросе не используется, то и декодирования его не будет, а значит и слайс тоже не получит указание использовать только эту партицию.
А у Вас очень похожая ситуация - слайс - год, а в запросе иерархия ГМД с указанием члена только на уровне день.
15 май 18, 16:22    [21411088]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 2676
sese
Andy_OLAP,

автор
Вывод - не делать физическую measure, а писать составную формулу, которая учитывает то, что будет выбран не единый уровень по измерению Дата - год, месяц, квартал, неделя, день, а несколько вариантов галочками.
И в таком случае искать из выбранных последний день и для него определять Value2 как last-child из Value.


Подсказочку бы...
А то вот переписал без физической меры, но не добился ничего. Такой же скан всей истории


create calculated member currentcube.Measures.[Кол-во SKU 2] as 
sum(
    {
        LinkMember(tail(existing [Дата].[День].[День]).Item(0),[Дата].[Год - Месяц - День]).Parent.Parent.FirstChild.FirstChild
        :
        LinkMember(tail(existing [Дата].[День].[День]).Item(0),[Дата].[Год - Месяц - День])
    },
    Measures.[Value]
    )

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

Что касается перебора.
create dynamic set currentcube.[Set_of_Days_without_Hierarchy] AS existing [Дата].[День].[День];
create dynamic set currentcube.[Set_of_Days_with_Hierarchy] AS existing [Дата].[Год - Месяц - День].[День];
Вот с этого нужно начать.
Что касается нужного набора - то логично, что он будет {[Дата].[Год - Месяц - День].&[20180101]:{[Дата].[Год - Месяц - День].CurrentMember} при условии, что CDbl(tail(existing [Set_of_Days_with_Hierarchy]).item(0).Properties("Key")) > CDbl (20180101).

Почему ключ для ключевого атрибута День нужно конвертировать функцией CDbl и сравнивать с CDbl (20180101), а не просто 20180101 - подумайте на досуге, это таки интересно :)
15 май 18, 16:23    [21411090]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 2676
ShIgor
sese,

тогда если это все сворачивается меньше чем в 4096 строк, то посмотрите настройку IndexBuildThreshold в msmdsrv.ini

а вообще тема древняя и мало что изменилось с того времени (тут)

Кстати, Моша в статье Get most out of partition slices в разделе Related attribites так и пишет: "FE (formula engine) does coordinate decoding lazily, only if it really needs to" и дальше объясняет, что если слайс = Год, но CurrentMember этого атрибута в запросе не используется, то и декодирования его не будет, а значит и слайс тоже не получит указание использовать только эту партицию.
А у Вас очень похожая ситуация - слайс - год, а в запросе иерархия ГМД с указанием члена только на уровне день.

Он еще мог слайс записать как [Дата].[Год].&[2018], а нужно было как [Дата].[Год-Месяц-День].&[2018], потому что первый вариант - это неключевой атрибут, а второй вариант - это уровень иерархии, под которым явно собраны все даты 2018-го года...
15 май 18, 16:32    [21411116]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
sese
Member

Откуда: маськва
Сообщений: 78
Andy_OLAP,


автор
Что касается перебора.
create dynamic set currentcube.[Set_of_Days_without_Hierarchy] AS existing [Дата].[День].[День];
create dynamic set currentcube.[Set_of_Days_with_Hierarchy] AS existing [Дата].[Год - Месяц - День].[День];
Вот с этого нужно начать.


В свое время я было пытался креативить named set-ы, но меня раздражало то, что при первом в сессии обращении к кубу всё приличненько так зависало на вычислении этих сетов. И как-то не пошло у меня с named set-ами. Так что сейчас придется погружаться повторно с нуля =) Ладно, пасиб за подсказки!
15 май 18, 17:38    [21411316]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
sese
Member

Откуда: маськва
Сообщений: 78
Andy_OLAP,


автор
Он еще мог слайс записать как [Дата].[Год].&[2018], а нужно было как [Дата].[Год-Месяц-День].&[2018], потому что...



А если я зайду с иерархии "год-неделя-день"? или вообще с "Месяц - месяц конкретного года - день"?
А так да, я ж в корневом посте признал, что именно так ([Дата].[Год].&[2018]) слайс и записан =)
15 май 18, 17:41    [21411326]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 2676
sese
Andy_OLAP,


автор
Что касается перебора.
create dynamic set currentcube.[Set_of_Days_without_Hierarchy] AS existing [Дата].[День].[День];
create dynamic set currentcube.[Set_of_Days_with_Hierarchy] AS existing [Дата].[Год - Месяц - День].[День];
Вот с этого нужно начать.


В свое время я было пытался креативить named set-ы, но меня раздражало то, что при первом в сессии обращении к кубу всё приличненько так зависало на вычислении этих сетов. И как-то не пошло у меня с named set-ами. Так что сейчас придется погружаться повторно с нуля =) Ладно, пасиб за подсказки!

Потому что Вы делали named set как filter(крупное измерение, условие отбора по группе мер на лету), а тут достаточно как existing набор уровней иерархии или existing набор ключевых атрибутов измерения, без отбора по физической мере (который постоянно будет требовать сканирование всех секций такой группы мер), а или без условия, или по условию, которое можно не засовывать в named set, а каждый раз копи-пастить внутрь формулы для calculated measure.
15 май 18, 21:26    [21411790]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
sese
Member

Откуда: маськва
Сообщений: 78
Andy_OLAP,

Прошу простить, но пока эксперименты с сетами застопорились вот на чем:

create dynamic set [Existing Дата День День] as existing [Дата].[День].[День];
create dynamic set [Existing Год Месяц День] as exists([Дата].[Год - Месяц - День].[День], [Existing Дата День День]);
create dynamic set [Year To Date] as  
{
    [Дата].[Год - Месяц - День].[День].&[20180101]
    :
    tail([Existing Год Месяц День]).Item(0)
};

create calculated member currentcube.measures.[Границы Year To Date] as 
CSTR(head([Year To Date]).item(0).properties('name')) + '-' + 
CSTR(tail([Year To Date]).item(0).properties('name'));

create calculated member currentcube.measures.[Границы Existing Год Месяц День] as 
CSTR(head([Existing Год Месяц День]).item(0).properties('name')) + '-' + 
CSTR(tail([Existing Год Месяц День]).item(0).properties('name'));


приводят к следующему результату:

Дата.Год - Неделя - ДеньWeek 3 2018
Границы Year To Date15.01.2018-21.01.2018
Границы Existing Год Месяц День15.01.2018-21.01.2018


Для простоты начало года в сете [Year To Date] задаю однозначно.
Вот почему сет [Year To Date] не подхватывает все дни с начала года?
18 май 18, 12:18    [21419885]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
sese
Member

Откуда: маськва
Сообщений: 78
И еще заметил интересный эффект: если вдруг имя сета совпадет с именем любого мембера любого атрибута любого измерения, то при попытке получить

tail([сет, чье имя совпадает с именем какого-то мембера]).Item(0).Properties('key') = <Key того мембера, с которым сет совпал по имени>
18 май 18, 12:56    [21420084]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 2676
sese,
Вот так неправильно.
scope([Дата].[День].[День],Measures.[Value2]);
this =
-- вот здесь мы будем складывать только те дни, где они попадают в период с 1 января 2018
iif(
intersect(existing [Дата].[День].[День], StrToMember("[Дата].[День].&[20180101]"):null).count>0,
SUM(
 -- для каждого дня сложим, а для мультиселекта в общий итог пойдет вся сумма, что неправильно
{[Дата].[День].&[20180101]:[Дата].[День].CurrentMember},[measures].[Value]),
null);
end scope;

А вот так правильно.
create dynamic set [set1] as existing [Дата].[День].[День];

create calculated member currentcube.measures.[Value2] as
iif(
-- на каждом уровне свой хвост !!!, на общем итоге свой хвост
-- именно поэтому используем existing [set1]
intersect(existing [set1], StrToMember("[Дата].[День].&[20180101]"):null).count>0,
sum(
[Дата].[День].&[20180101]:
-- а вот здесь не используем set от сессии, а используем набор ключевых элементов измерения
tail(nonempty(existing [Дата].[День].[День], [Measures].[какой нибудь физический счетчик дней как мера суммировани])).Item(0),
[measures].[Value]),null),
VISIBLE = 1;
18 май 18, 14:09    [21420331]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 2676
Andy_OLAP,
Для красоты поправим, взяв явно в фигурные скобки.

create dynamic set [set1] as existing [Дата].[День].[День];

create calculated member currentcube.measures.[Value2] as
iif(
-- на каждом уровне свой хвост !!!, на общем итоге свой хвост
-- именно поэтому используем existing [set1]
intersect(existing [set1], {StrToMember("[Дата].[День].&[20180101]"):null}).count>0,
sum(
[Дата].[День].&[20180101]:
-- а вот здесь не используем set от сессии, а используем набор ключевых элементов измерения
tail(nonempty(existing [Дата].[День].[День], [Measures].[какой нибудь физический счетчик дней как мера суммировани])).Item(0),
[measures].[Value]),null),
VISIBLE = 1;
18 май 18, 14:11    [21420339]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 2676
sese
И еще заметил интересный эффект: если вдруг имя сета совпадет с именем любого

"вдруг" имя сета никак не может совпасть. Ведь его ВЫ пишете, а не дядя Вася, слесарь 6-го разряда.

Используйте уникальные кошерные имена, типа set1, set2, set3, всегда их описание в начало calculation для куба - и будет все хорошо!
18 май 18, 14:13    [21420345]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
sese
Member

Откуда: маськва
Сообщений: 78
Andy_OLAP,

а StrToMember зачем? И почему не используется иерархия ГМД, которую было предложено писать в Slice?
18 май 18, 14:34    [21420427]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
sese
Member

Откуда: маськва
Сообщений: 78
Andy_OLAP,

И почему все-таки сет [Year To Date] в моем примере не подхватывает дни с начала года?
18 май 18, 14:35    [21420431]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
sese
Member

Откуда: маськва
Сообщений: 78
Andy_OLAP,

ну и вот это я пока не смог постичь:

tail(nonempty(existing [Дата].[День].[День], [Measures].[какой нибудь физический счетчик дней как мера суммировани])).Item(0)


В чем отличие

existing [Дата].[День].[День]


от сета 1 ? Зачем нужен физический счетчик дней?
18 май 18, 14:49    [21420485]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 2676
sese
Andy_OLAP,

ну и вот это я пока не смог постичь:

tail(nonempty(existing [Дата].[День].[День], [Measures].[какой нибудь физический счетчик дней как мера суммировани])).Item(0)


В чем отличие

existing [Дата].[День].[День]


от сета 1 ? Зачем нужен физический счетчик дней?

Потому что для красоты. У Вас в измерении дней пользователи могут выбрать дни праздников, когда фактов быть не может, могут выбрать даты из будущего.
И тогда для скажем средней цены продаж Вы посчитаете продажи только в реальные дни продаж и поделите на календарный счетчик count(existing [Дата].[День].[День]). Это не оптимально. А когда есть физические меры типа количества дней, количества праздничных дней, количества будней и так далее, привязанных напрямую Regular к измерению дней в отдельной группе мер - решение получается гибким.

Но это эстетика, кто как хочет.
18 май 18, 21:19    [21421576]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
sese
Member

Откуда: маськва
Сообщений: 78
Andy_OLAP,


автор
У Вас в измерении дней пользователи могут выбрать дни праздников, когда фактов быть не может, могут выбрать даты из будущего.



Прошу простить, но, как мне кажется, это - шаг сильно в сторону от мучающей меня проблемы.

1. Я предлагаю говорить только о СОСТОЯНИИ. Не про аддитивные меры и не про среднее. Только о состоянии. При изменении состояния делаются две записи: старое состояние с минусом и новое с плюсом. Состояние на любой момент есть сумма или с начала времен (тогда моя проблема чтения всей истории перестает быть проблемой), или от некоего начального состояния (и вот тут - я позволю себе напомнить - я сталкиваюсь с ненужным чтением партиций, принадлежащих периодам ДО даты начального состояния).
В принципе все сказанное о состоянии полностью применимо и к остатку, когда остаток на любой момент времени есть опорный остаток плюс сумма всех движений. И совершенно без разницы, есть ли в выбранную пользователем дату какие-либо изменения состояния (или товарные движения, изменяющие остаток). А так же совершенно без разницы, праздничный то день или будний. Не вижу криминала в желании пользователя посмотреть в самый праздничный день, какой у него остаток на складе или сколько скю являются бестселлерами\дедстоками.
Что же до выбора пользователем будущих дней, то тут все просто: чтобы Last Child хорошо считал результат выше листевого уровня для незавершившегося периода и не нужно было отдельно приравнивать результат текущего месяца последнему дню (что чревато ошибками, кстати), я просто сделаю календарь, который будет заканчиваться днем последнего состояния\остатка. Если я в хранилище загружаю каждый день вчерашний день, то мое измерение времени каждый день будет заканчиваться вчерашним днем. И все, пользователь в принципе не выберет ненаступивший день. И LastChild всегда будет давать результат текущего незавершившегося месяца и незавершившегося года.
Но тема ненаступивших дней в общем-то тоже слабо относится к проблеме.
2. Задачу состояния (или остатка) на любой момент я решал с помощью двух физических мер (Sum & Last Child) и скоупа, связывающего одно с другим.
3. Мне вами было предложено использовать иерархию "Год-Месяц-День" и два именованных набора: [Дата].[День].[День] и [Дата].[Год-Месяц-День].[День]. И, насколько я понял, вы предлагаете отказаться от физической меры вообще и LastChild-a в частности.

Могу я попросить раскрыть именно путь в пункте 3?
Я прописываю на партициях Slice ГМД, но не добиваюсь результата, чтение идет всей истории.
Я пытаюсь получить сет с набором дней от начального состояния до последней даты выбранного пользователем периода, но и тут не преуспеваю - см. выше.
И вот от этого впадаю в меланхолию и очень хочется, чтобы кто-то наставил на путь истинный =(
20 май 18, 03:08    [21423310]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 2676
sese
Andy_OLAP,


автор
У Вас в измерении дней пользователи могут выбрать дни праздников, когда фактов быть не может, могут выбрать даты из будущего.



Прошу простить, но, как мне кажется, это - шаг сильно в сторону от мучающей меня проблемы.

1. Я предлагаю говорить только о СОСТОЯНИИ. Не про аддитивные меры и не про среднее. Только о состоянии. При изменении состояния делаются две записи: старое состояние с минусом и новое с плюсом. Состояние на любой момент есть сумма или с начала времен (тогда моя проблема чтения всей истории перестает быть проблемой), или от некоего начального состояния (и вот тут - я позволю себе напомнить - я сталкиваюсь с ненужным чтением партиций, принадлежащих периодам ДО даты начального состояния).
В принципе все сказанное о состоянии полностью применимо и к остатку, когда остаток на любой момент времени есть опорный остаток плюс сумма всех движений. И совершенно без разницы, есть ли в выбранную пользователем дату какие-либо изменения состояния (или товарные движения, изменяющие остаток). А так же совершенно без разницы, праздничный то день или будний. Не вижу криминала в желании пользователя посмотреть в самый праздничный день, какой у него остаток на складе или сколько скю являются бестселлерами\дедстоками.
Что же до выбора пользователем будущих дней, то тут все просто: чтобы Last Child хорошо считал результат выше листевого уровня для незавершившегося периода и не нужно было отдельно приравнивать результат текущего месяца последнему дню (что чревато ошибками, кстати), я просто сделаю календарь, который будет заканчиваться днем последнего состояния\остатка. Если я в хранилище загружаю каждый день вчерашний день, то мое измерение времени каждый день будет заканчиваться вчерашним днем. И все, пользователь в принципе не выберет ненаступивший день. И LastChild всегда будет давать результат текущего незавершившегося месяца и незавершившегося года.
Но тема ненаступивших дней в общем-то тоже слабо относится к проблеме.
2. Задачу состояния (или остатка) на любой момент я решал с помощью двух физических мер (Sum & Last Child) и скоупа, связывающего одно с другим.
3. Мне вами было предложено использовать иерархию "Год-Месяц-День" и два именованных набора: [Дата].[День].[День] и [Дата].[Год-Месяц-День].[День]. И, насколько я понял, вы предлагаете отказаться от физической меры вообще и LastChild-a в частности.

Могу я попросить раскрыть именно путь в пункте 3?
Я прописываю на партициях Slice ГМД, но не добиваюсь результата, чтение идет всей истории.
Я пытаюсь получить сет с набором дней от начального состояния до последней даты выбранного пользователем периода, но и тут не преуспеваю - см. выше.
И вот от этого впадаю в меланхолию и очень хочется, чтобы кто-то наставил на путь истинный =(


"Состояние на любой момент есть сумма или с начала времен " - таки да. Поэтому Value - агрегация SUM, Value2 - агрегация Last-Child, мера из группы мер со счетчиком дней, которая связана только с измерением дат.
А далее scope value2,день this = sum(null:[Дата].[Год-Месяц-День].CurrentMember,Value) и так далее.

Но есть нюанс. Вот если агрегация last-non-empty - все хорошо. А для last-child нужно в каждом месяце в первом числе иметь кошерный входящий остаток и считать внутри месяца (или другого периода). И тогда не просто sum, а mtd() или ytd() и так далее.

И если периоды в секциях привязаны с учетом иерархии, в которой присутствуют нарезанные периоды, например, [Дата].[Год-Месяц-День].[Месяц].&[201711], то все будет хорошо. И никаких лишних чтений.

Что касается Вашего случая - видимо, между днем и месяцем как атрибутами, которые затем ложатся в одноименные уровни иерархии, нет rigid и не выбран тип атрибута - не Regular, а Days и Months. Тогда и mtd() будет хорошо работать, и лишних чтений не будет.

Вам бы взять хороший пустой проект за основу и посмотреть...Но не у моих бойцов, а у каких-нибудь российских ритейлеров. Южакова Александра попросите, чтобы он к Вам тим-вьевером подцепился и посмотрел беглым взором, что не так с измерением дат.
21 май 18, 16:43    [21426560]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
sese
Member

Откуда: маськва
Сообщений: 78
Andy_OLAP,


За контакт, к которому можно попробовать обратиться, спасибо.

В очередной раз резюмирую:

1. Оставил в измерении времени вообще одну иерархию: Год-Квартал - Месяц - День.
Все релейшены между арибутами проставлены и тип у всех отношений - rigid, все атрибуты имеют свой тип: Days, Months, ... - ничего делать не пришлось, все и так было.
2. На партиции прописал слайс вида [Дата].[Год-Квартал - Месяц - День].[Месяц].&[201805]
3. Ах да, каждый месяц независим: на первое число дано состояние всех скю и потом только изменения - так и было в боевой версии. С начальным состоянием на год в предыдущих примерах это я уже экспериментировал отдельно =)
4. Скоуп заменен на

create dynamic set currentcube.[Existing day pool] as existing [Дата].[Год - Квартал - Месяц -День].[День]; 

create calculated member currentcube.Measures.[Кол-во SKU 3] as 
SUM(
MTD(tail([Existing day pool]).Item(0)),
measures.[Value]
);


Результаты тестирования:
1. При выборе месяца, квартала и года - все зашибись, читает только нужное и делает это максимально быстро.
2. А вот при выборе конкретного дня - скан всей истории. Но в принципе я неоптимально искал первое число месяца (вот так:

{
StrToMember(
'[Дата].[День].&[' + Left(Cstr([Дата].[День].CurrentMember.properties('key')),6) + '01]'
,constrained)
:
[Дата].[День].CURRENTMEMBER
}


) и с заменой на MTD прирост производительности налицо. Хотя до идеала не добралось.
3. При попытке вставить сет в скоуп

scope(
--[Дата].[Год - Квартал - Месяц -День].[День],
[Existing day pool],
Measures.[Кол-во SKU]
);
this =
SUM(
MTD([Дата].[Год - Квартал - Месяц -День].CURRENTMEMBER),
measures.[Value]
);
this = iif( Measures.[Кол-во SKU] <> 0,Measures.[Кол-во SKU], null  );
end scope;


на этапе сохранения изменений в проекте появилось сообщение вида "невозможно вычислить сет в области запроса"


То есть подвижки в нужном направлении с вашими подсказками есть существенные, спасибо.
Буду копать дальше =)
22 май 18, 02:39    [21427503]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
sese
Member

Откуда: маськва
Сообщений: 78
Final Update:


Поскольку нетрудно увидеть, что мое предыдущее сообщение содержит ошибку, то оно-то шагом к решению не является.
Проблема не в измерении времени, не в отношении между атрибутами или типизации атрибутов. Проблема не в Slice, хотя все же спасибо за подсказки.
Ларчик открывается просто: для аддитивных мер достаточно ProcessData. А вот полуаддитивные без ProcessIndexes фурычить не хотят. Но как только - так сразу!

Фсё, всем спасибо, тема точно закрыта.
9 июн 18, 17:33    [21482505]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
И_Павел_С
Member

Откуда:
Сообщений: 39
Всем доброго времени!
Не знаю в правильную ли тему пишу, но у меня как раз проблема в фундаментальных знаниях. В общем, только-только начал изучать SSAS и работу в Visual Studio. И вот на видео у лектора на вкладке Browse есть как бы поля, куда мы перемещаем измерения, которые хотим видеть в столбцах или строках сводной таблицы (см. рисунок). А вот у меня такого нет ни в Visual Studio, ни в Managment Studio после развертывания куба. То есть у меня измерения и меры встают как бы в одну строку, и результатом получается обычная таблица, а не сводная.
В яндексе решения не нашел, хотя может просто потому, что не знаю как правильно задать запрос.
Надеюсь на вашу помощь.

К сообщению приложен файл. Размер - 144Kb
16 июн 18, 23:01    [21496896]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 30734
Блог
так было раньше
16 июн 18, 23:37    [21496964]     Ответить | Цитировать Сообщить модератору
 Re: Пробелы в фундаментальных знаниях? MDX Scope...  [new]
И_Павел_С
Member

Откуда:
Сообщений: 39
Критик,
хм... То есть раньше было нагляднее? Странно как-то... Ну да ладно. Спасибо.
16 июн 18, 23:58    [21496990]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / OLAP и DWH Ответить