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

Откуда:
Сообщений: 133
Доброго времени суток!
Есть SQL-таблица прайсов, в которой цены устанавливаются на определенный товар в какой-то день. И эти цены действуют до очередного изменения, которое может произойти в любой день. Соответственно, в этой таблице накапливаются только даты установки прайсов.

Вопрос: есть ли возможность отразить в CM (Analysis2000) на каждый день последнюю цену до следующего изменения? Соответственно, как только состоялось новое изменение, отражается именно оно до следующего и т.д.?
Или выход только в заполнении SQL-таблицы ценами на каждый день, у которых дата равна или более даты изменения цены и менее, чем дата следующего изменения этой цены?

В кубе измерение времени "Дата" имеет иерархию: Год - Месяц - Декада - День.
Большое спасибо заранее!
23 апр 09, 07:51    [7102203]     Ответить | Цитировать Сообщить модератору
 Re: Прайсы. Заполнение значениями до следующего изменения.  [new]
Алексей Кудинов
Member

Откуда:
Сообщений: 182
nextTyro,
Если над ценами не нужно вычислять какие-либо агрегированные показатели (средняя цена по направлению и т.д.), то в SSAS 2005 для обычных мер есть AggregationFunction = LastNonEmpty, при ее использовании по каждому товару как раз будет показываться последняя выставленная по нему цена.

К сожалению, при снятии цены по группе товаров AS не будет вычислять последнюю цену по каждому товару, он возьмет только цены за последнюю дату изменения цен в этой группе.
23 апр 09, 10:21    [7102660]     Ответить | Цитировать Сообщить модератору
 Re: Прайсы. Заполнение значениями до следующего изменения.  [new]
nextTyro
Member

Откуда:
Сообщений: 133
У меня в параллели работает и SSAS2005, нo Standart Edition. И из семиаддитивных функций доступна только LastChild. На форуме прочла, что достаточно присвоить мере "Price" в ее свойствах AggregateFunction - LastChild. И где-то в фактах указать значение - "показывать последний день". Где - не могу найти. А сейчас все сворачивается на начальную дату измерения "Time". Не подскажете? Или где прочитать про варианты установок ...
6 май 09, 13:09    [7152553]     Ответить | Цитировать Сообщить модератору
 Re: Прайсы. Заполнение значениями до следующего изменения.  [new]
nextTyro
Member

Откуда:
Сообщений: 133
Или это как-то решается через СМ?
7 май 09, 08:20    [7155819]     Ответить | Цитировать Сообщить модератору
 Re: Прайсы. Заполнение значениями до следующего изменения.  [new]
Владимир Штепа
Member

Откуда: Hannover
Сообщений: 6001
Так как у вас нет в распоряжении функции LastNonEmpty
то придется писать руками MDX для CM

Благо на форуме примеров не мало. Если возникнут трудности в инерпретации, дайте знать, поможем.
7 май 09, 14:23    [7158002]     Ответить | Цитировать Сообщить модератору
 Re: Прайсы. Заполнение значениями до следующего изменения.  [new]
nextTyro
Member

Откуда:
Сообщений: 133
Измерение Time.Дата (в AS2005) имеет иерархию Year-Quarter-Month-Decade-Id. База обрезана (с 31.12.2008 года), соответственно измерение Time.Дата включает в себя период с 31.12.2008 г. по 31.12.2009 г. Но в таблице Prices цены на товар с 01.01.2002 года, и по сей день они меняются. Запуталась с датами. Читаю:

--дотягиваем последнее значение "до конца" времени
([Calendar].[Date].&[20070522] : NULL, [Amount End]) = [Calendar].[Date].&[20070521];

У меня это, видимо, до конца года? .... Не могу понять, что за даты ставятся и почему разница в один день.

--Потом она копируется в calculated measure.
CREATE [Display Amount End] = [Amount End];

--потом пишется простой SCOPE, который обнуляет этот calculated measure на тех месяцах где надо:
([Calendar].[Date].&[20070522] : NULL, [Display Amount End]) = NULL;
([Calendar].[Month].&[200706] : NULL, [Display Amount End]) = NULL;
([Calendar].[Quarter].&[200703] : NULL, [Display Amount End]) = NULL;
([Calendar].[Year].&[2008] : NULL, [Display Amount End]) = NULL;

У меня:
([Time].[Дата].[ID].&[.......]: NULL, [PriceLCh]) = NULL;
([Time].[Дата].[Decad].&[.......] : NULL, [PriceLCh]) = NULL;
([Time].[Дата].[Month].&[.......] : NULL, [PriceLCh]) = NULL;
([Time].[Дата].[Quarter].&[.......] : NULL, [PriceLCh]) = NULL;
([Time].[Дата].[Year].&[.......] : NULL, [PriceLCh]) = NULL;
Опять же не могу определиться с датами... Жалуется на невозможность преобразовать
строку "20020101" в тип date.
12 май 09, 15:19    [7170266]     Ответить | Цитировать Сообщить модератору
 Re: Прайсы. Заполнение значениями до следующего изменения.  [new]
nextTyro
Member

Откуда:
Сообщений: 133
Натолкните на мысль, пожалуйста. Что-то я абсолютно расстраиваюсь с SSAS2005 Standart Edition. Проштудировала топики, все, что нашла по поиску в форуме, вариаций делала массу - но результат нулевой. Есть мера Price с разреженными данными с 01.01.2002 года. В свойствах она LastChild. Далее в ScriptView:

([Time].[Id].&[2009-05-14T00:00:00] : NULL, [Price]) = [Time].[Id].&[2009-05-13T00:00:00];
CREATE [PriceLCh] = [Price];

ну - пока без Володиных оптимизаций. И в итоге - пустота.
14 май 09, 09:35    [7177788]     Ответить | Цитировать Сообщить модератору
 Re: Прайсы. Заполнение значениями до следующего изменения.  [new]
Fec un Tues
Member

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

LastChild агрегирует невдумчиво. Если в фактах для каких-то дней есть дырки, они будут заброшены наверх.

Вы готовы каждый день менять дату [Time].[Id].&[2009-05-14T00:00:00]?
14 май 09, 10:43    [7178190]     Ответить | Цитировать Сообщить модератору
 Re: Прайсы. Заполнение значениями до следующего изменения.  [new]
nextTyro
Member

Откуда:
Сообщений: 133
А выход? Может как-то убирать пустышки? И есть ли вообще такая возможность?
Владимир Штепа как-то вышел из ситуации не менять даты каждый день.
14 май 09, 11:07    [7178388]     Ответить | Цитировать Сообщить модератору
 Re: Прайсы. Заполнение значениями до следующего изменения.  [new]
Fec un Tues
Member

Откуда:
Сообщений: 1024
Пустышки ведь можно убирать прямо в фактах.
14 май 09, 11:34    [7178607]     Ответить | Цитировать Сообщить модератору
 Re: Прайсы. Заполнение значениями до следующего изменения.  [new]
nextTyro
Member

Откуда:
Сообщений: 133
Вы хотите сказать, что в фактах надо вплоть до очередного изменения цены тупо проставлять предыдущую цену? Так я именно этого и пытаюсь избежать.
Я только одного не могу понять. Откуда появляются в LastChild пустышки, если он должен тянуть последнюю цену в прайсе, например, выставленную 28 апреля 2003 года до сего дня, если не было изменений?
14 май 09, 12:32    [7178988]     Ответить | Цитировать Сообщить модератору
 Re: Прайсы. Заполнение значениями до следующего изменения.  [new]
Fec un Tues
Member

Откуда:
Сообщений: 1024
LastChild ничего тянуть не должен.

Вы избегаете ежедневных snapshot'ов цен? А что здесь такого?
14 май 09, 12:51    [7179103]     Ответить | Цитировать Сообщить модератору
 Re: Прайсы. Заполнение значениями до следующего изменения.  [new]
nextTyro
Member

Откуда:
Сообщений: 133
Порядка 20 тыс. номенклатуры в приблизительно 60 филиалах ну и в разрезе дней нескольких лет. Там уже миллиардами пахнет. А разве я неправильно пытаюсь применить к своему случаю LastChild? (См. Алексей Кудинов, Владимир Штепа)

Алексей Кудинов
nextTyro,
Если над ценами не нужно вычислять какие-либо агрегированные показатели (средняя цена по направлению и т.д.), то в SSAS 2005 для обычных мер есть AggregationFunction = LastNonEmpty, при ее использовании по каждому товару как раз будет показываться последняя выставленная по нему цена.
14 май 09, 13:07    [7179223]     Ответить | Цитировать Сообщить модератору
 Re: Прайсы. Заполнение значениями до следующего изменения.  [new]
Fec un Tues
Member

Откуда:
Сообщений: 1024
Вы бы правильно применяли к своему случаю LastChild, если бы в фактах был ежедневный shapshot. Но теперь понятно, что это слишком накладно.

Можно было бы попробовать избавиться от пустышек так:

( [Date].[Date].[Date], [Price] ) = Iif( IsEmpty( [Price] ), [Date].[Date].PrevMember, [Price] );

но вряд ли это будет работать быстро.
14 май 09, 13:59    [7179586]     Ответить | Цитировать Сообщить модератору
 Re: Прайсы. Заполнение значениями до следующего изменения.  [new]
nextTyro
Member

Откуда:
Сообщений: 133
Спасибо большое - сейчас попробую адаптировать к своему случаю, посмотреть скорость работы. А насчет ежедневных snapshots - я как раз с этого и начинала:
nextTyro

Вопрос: есть ли возможность отразить в CM (Analysis2000) на каждый день последнюю цену до следующего изменения? Соответственно, как только состоялось новое изменение, отражается именно оно до следующего и т.д.?
Или выход только в заполнении SQL-таблицы ценами на каждый день, у которых дата равна или более даты изменения цены и менее, чем дата следующего изменения этой цены?

Мне интересно решение этого вопроса, так же, и в AS2005, так как эта система у меня тоже работает и нравится все больше и больше. Но .... досадный Standart Edition.
14 май 09, 14:24    [7179774]     Ответить | Цитировать Сообщить модератору
 Re: Прайсы. Заполнение значениями до следующего изменения.  [new]
Fec un Tues
Member

Откуда:
Сообщений: 1024
А еще факты можно заполнять изменениями цен.
15 май 09, 06:58    [7182804]     Ответить | Цитировать Сообщить модератору
 Re: Прайсы. Заполнение значениями до следующего изменения.  [new]
nextTyro
Member

Откуда:
Сообщений: 133
Да, я так и сделала вчера в конце концов. И все-таки интерес к LastChild остался.
15 май 09, 09:51    [7183207]     Ответить | Цитировать Сообщить модератору
 Re: Прайсы. Заполнение значениями до следующего изменения.  [new]
Fec un Tues
Member

Откуда:
Сообщений: 1024
То есть Вы от LastChild отказались? Каким образом?
15 май 09, 10:02    [7183246]     Ответить | Цитировать Сообщить модератору
 Re: Прайсы. Заполнение значениями до следующего изменения.  [new]
nextTyro
Member

Откуда:
Сообщений: 133
Я пока сделала это в AS2000. Пришлось прибегнуть к CM, тупо вычислять разницу в новом прайсе по отношению к старому, ну а потом собирать, как остатки по известной формуле:

sum(Ascendants([Дата].CurrentMember),(sum([Дата].FirstSibling :[Дата].CurrentMember ,[Measures].[Прайсы]))-[Measures].[Прайсы])+[Measures].[Прайсы]
15 май 09, 13:18    [7184881]     Ответить | Цитировать Сообщить модератору
 Re: Прайсы. Заполнение значениями до следующего изменения.  [new]
Fec un Tues
Member

Откуда:
Сообщений: 1024
Кажется я придумал, как можно относительно быстро дотягивать последние непустые значения в SSAS 2005. Изложение идеи на Adventure Works:

with
	member FirstID as DataID( [Date].[Date].[Date].Item( 0 ) )
	
	member CurrentID as
		 Iif( IsEmpty( [Internet Sales Amount] ), null, DataID( [Date].[Date] ) )
		,Non_Empty_Behavior = [Internet Sales Amount]
		
	member LastID as Max( null : [Date].[Date], CurrentID )
	
	member LastNonEmpty as
		Iif(
			 LastID < FirstID
			,null
			,(
				 [Date].[Date].[Date].Item( LastID - FirstID )
				,[Internet Sales Amount]
			)
		)
		
select 
	 Head( [Date].[Date].[Date], 50 ) on 0
	,non empty [Product].[Product].[Product] on 1
from [Adventure Works]
where LastNonEmpty
15 май 09, 18:27    [7187127]     Ответить | Цитировать Сообщить модератору
 Re: Прайсы. Заполнение значениями до следующего изменения.  [new]
Mosha
Member

Откуда:
Сообщений: 1272
Fec un Tues
Кажется я придумал, как можно относительно быстро дотягивать последние непустые значения в SSAS 2005. Изложение идеи на Adventure Works

Это очень рискованное решение, оно опирается на то что DataID используется как индех уровня attribute hierarchy. А это совсем никак не гарантировано, и любая операция processing может это нарушить.
15 июл 09, 19:20    [7421024]     Ответить | Цитировать Сообщить модератору
 Re: Прайсы. Заполнение значениями до следующего изменения.  [new]
Fec un Tues
Member

Откуда:
Сообщений: 1024
Моша, спасибо за замечание. Так должно быть безопаснее:

with
	member CurrentKey as
		 Iif( IsEmpty( [Internet Sales Amount] ), null, [Date].[Date].Member_Key )
		,Non_Empty_Behavior = [Internet Sales Amount]
		
	member LastKey as Max( null : [Date].[Date], CurrentKey )
	
	member LastNonEmpty as
		Iif(
			 IsEmpty( LastKey )
			,null
			,(
				 StrToMember( "[Date].[Date].&[" + LastKey + "]", Constrained )
				,[Internet Sales Amount]
			)
		)
		
select 
	 Head( [Date].[Date].[Date], 50 ) on 0
	,non empty [Product].[Product].[Product] on 1
from [Adventure Works]
where LastNonEmpty
15 июл 09, 21:03    [7421261]     Ответить | Цитировать Сообщить модератору
 Re: Прайсы. Заполнение значениями до следующего изменения.  [new]
Mosha
Member

Откуда:
Сообщений: 1272
Да, так безопаснее, но к сожалению медленнее. StrToMember и динамическое построение строки к сожалению всё будут сильно тормозить.

Моша
----------------------------------------------------
This posting is provided "AS IS" with no warranties, and confers no rights
15 июл 09, 21:08    [7421271]     Ответить | Цитировать Сообщить модератору
 Re: Прайсы. Заполнение значениями до следующего изменения.  [new]
Fec un Tues
Member

Откуда:
Сообщений: 1024
Может быть для 2008 это и так, но в 2005 SP2 второй запрос отработал быстрее. Кстати, именно страх StrToMember завел меня на зыбкую тропку DataID.
15 июл 09, 21:30    [7421312]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Прайсы. Заполнение значениями до следующего изменения.  [new]
Fec un Tues
Member

Откуда:
Сообщений: 1024
Если кому интересно, на днях Крис Веб предложил, на мой взгляд, более корректный вариант:
WITH
	MEMBER MEASURES.DAYSTODATE AS
		COUNT(NULL:[Date].[Date].CURRENTMEMBER)-1
	
	MEMBER MEASURES.HADSALE AS
		IIF([Measures].[Internet Sales Amount]=0, NULL, MEASURES.DAYSTODATE)
		
	MEMBER MEASURES.MAXDATE AS
		MAX(NULL:[Date].[Date].CURRENTMEMBER, MEASURES.HADSALE)
		
	MEMBER MEASURES.LASTSALE AS
		IIF(ISEMPTY(MEASURES.MAXDATE), NULL,
			([Measures].[Internet Sales Amount],
			[Date].[Date].[Date].MEMBERS.ITEM(MEASURES.MAXDATE)))

См. http://cwebbbi.wordpress.com/2011/03/24/last-ever-non-empty-a-new-fast-mdx-approach/
1 апр 11, 13:39    [10456846]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / OLAP и DWH Ответить