powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Вычесляемое поле
15 сообщений из 15, страница 1 из 1
Вычесляемое поле
    #32880476
OLAPMASTER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот пример как считаю нарастаюший итог, отсортированного по убыванию поля.

SUM({TAIL({ORDER({[Firmname].currentmember.level.members},[Measures].[Sales Val],ASC)},
rank([Firmname].currentmember, order( [Firmname].currentmember.level.members, [Measures].[Sales Val], BDESC ))
)},[Measures].[Sales Val])

Вот если будет 1000 членов в измерении то нормалек все посчитаеться а вот когда их 11000 то она просто не в состоянии посчитать. Есть какие нибудь способы оптимизации запроса?
...
Рейтинг: 0 / 0
Вычесляемое поле
    #32880515
OLAPMASTER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Речь идет о MS AS 2k SP3a. Машина на которой он крутиться Intel Xeon 1.2 HT
4Gb память, на такой машине можно атомный взрыв расчитать если все считать оптимально. Может кто то уже решал эту проблему, и есть более оптимальные формулы расчета нарастаюшего итога по полю отсортерованному(по возростанию или по убыванию).
...
Рейтинг: 0 / 0
Вычесляемое поле
    #32880566
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLAPMASTERВот пример как считаю нарастаюший итог, отсортированного по убыванию поля.

SUM({TAIL({ORDER({[Firmname].currentmember.level.members},[Measures].[Sales Val],ASC)},
rank([Firmname].currentmember, order( [Firmname].currentmember.level.members, [Measures].[Sales Val], BDESC ))
)},[Measures].[Sales Val])

Вот если будет 1000 членов в измерении то нормалек все посчитаеться а вот когда их 11000 то она просто не в состоянии посчитать. Есть какие нибудь способы оптимизации запроса?

1. Было бы проще вам подсказать, если бы Вы полностью привели текст запроса, желательно в терминах Food Mart 2000

2. Мне очень кажется, что как раз подобная тематика обсуждается в соседнем топике Рекурсия и Running Total (применительно к ABC Analysis)
...
Рейтинг: 0 / 0
Вычесляемое поле
    #32880663
OLAPMASTER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
backfire OLAPMASTERВот пример как считаю нарастаюший итог, отсортированного по убыванию поля.

SUM({TAIL({ORDER({[Firmname].currentmember.level.members},[Measures].[Sales Val],ASC)},
rank([Firmname].currentmember, order( [Firmname].currentmember.level.members, [Measures].[Sales Val], BDESC ))
)},[Measures].[Sales Val])

Вот если будет 1000 членов в измерении то нормалек все посчитаеться а вот когда их 11000 то она просто не в состоянии посчитать. Есть какие нибудь способы оптимизации запроса?

1. Было бы проще вам подсказать, если бы Вы полностью привели текст запроса, желательно в терминах Food Mart 2000

2. Мне очень кажется, что как раз подобная тематика обсуждается в соседнем топике Рекурсия и Running Total (применительно к ABC Analysis)


Да что то похожее.... только объемы инфо другие.
Щас в терминах FoodMart2000 попробую описать..
Так... там вот даже ничего близко нету
У вас есть 11000 наименований товара [itemname] и есть поле продажи в шт [sal]
И нужно показать нарастающий итог по полю [sal] отсортированным по убыванию т.е.

[itemname] [sal] [Running Total on Sal]
Водка 55 55
Колбаса 50 105
Сыр 40 145
Масло 10 155
Хлеб 5 160

Ну тоесть Водка, Колбаса и Сыр рулят!! :-).

Вот создаеться такое поле [Running Total on Sal]
SUM({TAIL({ORDER({[itemname].currentmember.level.members},
[Measures].[Sal],ASC)},
rank([itemname].currentmember, order([itemname].currentmember.level.members, [Measures].[Sal], BDESC ))
)},[Measures].[Sal])

Оно все нормально считает на небольших объемах но когда более даже 5 тыс членов все просто зависает!

ВОТ abc анализ примерно тоже самое, там надо процент посчитать от общего итога и разместить товар по группам. Если посчитать итог то можно посчитать процент и разместить по группам.
...
Рейтинг: 0 / 0
Вычесляемое поле
    #32880676
OLAPMASTER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2. Мне очень кажется, что как раз подобная тематика обсуждается в соседнем топике Рекурсия и Running Total (применительно к ABC Analysis) [/quot]

Да очень похоже только мне еще надо отсортировать по возростанию и убыванию.
...
Рейтинг: 0 / 0
Вычесляемое поле
    #32880836
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLAPMASTER2. Мне очень кажется, что как раз подобная тематика обсуждается в соседнем топике Рекурсия и Running Total (применительно к ABC Analysis)

Да очень похоже только мне еще надо отсортировать по возростанию и убыванию.[/quot]

А я там как раз по убыванию и сортирую.
...
Рейтинг: 0 / 0
Вычесляемое поле
    #32880864
OLAPMASTER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
backfire OLAPMASTER2. Мне очень кажется, что как раз подобная тематика обсуждается в соседнем топике Рекурсия и Running Total (применительно к ABC Analysis)

Да очень похоже только мне еще надо отсортировать по возростанию и убыванию.

А я там как раз по убыванию и сортирую.[/quot]

Ну я не нашел сортировки в твоих MDX, может по тому что ты работаеш с иерархией времени которая уже отсортирована и вот у меня продукты лежат отсортированные коека по алфовиту а мне их надо отсортировать с учетом поля [SAL] и знаю я только один способ это
order([itemname].currentmember.level.members, [Measures].[Sal], BDESC)
Вот он тебе вернет нормальное отсортерованное множество!
А уже после этого надо найти в этом множестве ранг и его складывать! Вот блин задача то, в принцепе HEAD тоже подойдет вот насколько быстро она будет работать незнаю.
...
Рейтинг: 0 / 0
Вычесляемое поле
    #32881278
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLAPMASTER backfire OLAPMASTER2. Мне очень кажется, что как раз подобная тематика обсуждается в соседнем топике Рекурсия и Running Total (применительно к ABC Analysis)

Да очень похоже только мне еще надо отсортировать по возростанию и убыванию.

А я там как раз по убыванию и сортирую.

Ну я не нашел сортировки в твоих MDX, может по тому что ты работаеш с иерархией времени которая уже отсортирована и вот у меня продукты лежат отсортированные коека по алфовиту а мне их надо отсортировать с учетом поля [SAL] и знаю я только один способ это
order([itemname].currentmember.level.members, [Measures].[Sal], BDESC)
Вот он тебе вернет нормальное отсортерованное множество!
А уже после этого надо найти в этом множестве ранг и его складывать! Вот блин задача то, в принцепе HEAD тоже подойдет вот насколько быстро она будет работать незнаю.[/quot]

А это что? Перетасовка колоды?
Код: plaintext
SET [RowSet2] AS 'topcount([RowSet0],1000,([Time].[1998], [Measures].[Store Sales]))'

Я так смотрю, что вы даже не удосужились исполнить мой запрос супротив FoodMart 2000, что видите какие то иерархии времени?
Так же как вы не привели ваш запрос в терминах FoodMart.
Думаете я на FoodMarte живу? Но я хочу, чтобы меня понимали в этом форуме, посему переписываю запрос для FoodMart.

Глянте же на результат запроса, неужли там не отсортировано?
...
Рейтинг: 0 / 0
Вычесляемое поле
    #32881292
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще один примерчик, в этом случае по Customers. Их в Фудмарте чуть больше 10к, что близко соответствует вашей задаче с номенклатурой.

Запрос вида

Код: plaintext
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.
26.
27.
28.
29.
30.
WITH 
-- % to Total
member [Time].[% to Total] as '
([Time].[1998], [Customers].CURRENTMEMBER,[Measures].CURRENTMEMBER)*100.0 / 
([Time].[1998], [Customers].[TotalMember],[Measures].CURRENTMEMBER)', SOLVE_ORDER= 1 

-- Runnig Total
member [Time].[Runnig Total] as '([Time].[1998],[Measures].CURRENTMEMBER,[Customers].CURRENTMEMBER) +
 Iif(RANK([Customers].CURRENTMEMBER,[TotalSet])=1,null,
([Time].[Runnig Total],[Measures].CURRENTMEMBER,
[TotalSet].Item(RANK([Customers].CURRENTMEMBER,[TotalSet])-2)))', SOLVE_ORDER= 1 

-- Runnig Total % Ratio
member [Time].[Runnig Total %] as '([Time].[1998],[Measures].CURRENTMEMBER,[Customers].CURRENTMEMBER) *100/([Time].[1998],[Measures].CURRENTMEMBER,[Customers].[TotalMember]) +
 Iif(RANK([Customers].CURRENTMEMBER,[TotalSet])=1,null,
([Time].[Runnig Total %],[Measures].CURRENTMEMBER,
[TotalSet].Item(RANK([Customers].CURRENTMEMBER,[TotalSet])-2)))', SOLVE_ORDER= 1 

SET [RowSet0] AS '[Customers].[Name].Members'
-- Sort 
SET [RowSet2] AS 'topcount([RowSet0],10000,([Time].[1998], [Measures].[Store Sales]))'
SET [TotalSet] AS '[RowSet2]'

member [Customers].[TotalMember] AS '[Customers].[All Customers]'
SELECT
CROSSJOIN({[Time].[ 1998 ],  [Time].[% to Total], [Time].[Runnig Total], [Time].[Runnig Total %]},{[Measures].[Store Sales], [Measures].[Unit Sales]}) ON COLUMNS,

{[Customers].[All Customers], [RowSet2]}

ON ROWS
FROM Sales

Выполняется на notebook c 1,3 Ghz жалкие 8 секундб и это с 10к елементов на оси.
Еще в прошлую пятницу, я считал почти как и вы

Код: plaintext
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.
26.
27.
28.
WITH 

-- % Ratio
member [Time].[% Ratio] as '
([Time].[1998], [Customers].CURRENTMEMBER,[Measures].CURRENTMEMBER)*100.0 / 
([Time].[1998], [Customers].[TotalMember],[Measures].CURRENTMEMBER)', SOLVE_ORDER= 1 

-- Runnig Total
member [Time].[Runnig Total] as '
SUM(HEAD([TotalSet],RANK([Customers].CURRENTMEMBER,[TotalSet])),
        ([Time].[1998],[Measures].CURRENTMEMBER))'

-- Runnig Total % Ratio
member [Time].[Runnig Total %] as '
SUM(HEAD([TotalSet],RANK([Customers].CURRENTMEMBER,[TotalSet])),
(([Time].[1998],[Customers].CURRENTMEMBER,[Measures].CURRENTMEMBER)*100.0 / 
 ([Time].[1998],[Customers].[TotalMember],[Measures].CURRENTMEMBER)))', SOLVE_ORDER= 1 

SET [RowSet0] AS '{[Customers].[Name].members}'
-- Sort 
SET [RowSet2] AS 'topcount([RowSet0],1000,([Time].[1998],[Measures].[Store Sales]) )'
SET [TotalSet] AS '[RowSet2]'

member [Customers].[TotalMember] AS '[Customers].[All Customers]'
SELECT
CROSSJOIN({[Time].[ 1998 ],[Time].[% Ratio],[Time].[Runnig Total],[Time].[Runnig Total %]}, 
{[Measures].[Store Sales], [Measures].[Profit]})  ON COLUMNS,
{[Customers].[All Customers], [RowSet2]} ON ROWS
FROM Sales

и запросы даже с 1000 элементов считались не менее 30 секунд, а про 10000 элементов я вообще молчу.
...
Рейтинг: 0 / 0
Вычесляемое поле
    #32882210
Э-э... Видать не тот FoodMart юзаю. Цифирь нет совсем... 8-((
...
Рейтинг: 0 / 0
Вычесляемое поле
    #32882267
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Злобный ныпэрсЭ-э... Видать не тот FoodMart юзаю. Цифирь нет совсем... 8-((

В поставочном варианте в Foodmart только один партишн, на данные с 97 года и их там мало. Потрудитесь создать второй партишн на таблице фактов за 98 год (для Sales это sales_fact_1998) и вы получите цифры такие же как и я.
...
Рейтинг: 0 / 0
Вычесляемое поле
    #32882614
Блин. Какая неприятная невнимательность. Пасибки 8-))
...
Рейтинг: 0 / 0
Вычесляемое поле
    #32885185
OLAPMASTER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да у меня одна вычесляемая ячейка а не запрос MDX интересует.

'([Time].[1998],[Measures].CURRENTMEMBER,[Customers].CURRENTMEMBER) +
Iif(RANK([Customers].CURRENTMEMBER,[TotalSet])=1,null,
([Time].[Runnig Total],[Measures].CURRENTMEMBER,
[TotalSet].Item(RANK([Customers].CURRENTMEMBER,[TotalSet])-2)))'
Вот попробую это переделать под себя и посмотреть что получеться.
Что касаеться запросов я их не пешу пока, больно грамостко это мне SQL хватает.

Всеравно спасибо.
...
Рейтинг: 0 / 0
Вычесляемое поле
    #32885257
Владимир Штепа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLAPMASTERДа у меня одна вычесляемая ячейка а не запрос MDX интересует.

'([Time].[1998],[Measures].CURRENTMEMBER,[Customers].CURRENTMEMBER) +
Iif(RANK([Customers].CURRENTMEMBER,[TotalSet])=1,null,
([Time].[Runnig Total],[Measures].CURRENTMEMBER,
[TotalSet].Item(RANK([Customers].CURRENTMEMBER,[TotalSet])-2)))'
Вот попробую это переделать под себя и посмотреть что получеться.
Что касаеться запросов я их не пешу пока, больно грамостко это мне SQL хватает.

Всеравно спасибо.

Ну я то их руками только в форуме пишу, да в Sample MDX Application, a так я генератор MDX запросов пишу (на C#).
...
Рейтинг: 0 / 0
Вычесляемое поле
    #32885395
OLAPMASTER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
backfire OLAPMASTERДа у меня одна вычесляемая ячейка а не запрос MDX интересует.

'([Time].[1998],[Measures].CURRENTMEMBER,[Customers].CURRENTMEMBER) +
Iif(RANK([Customers].CURRENTMEMBER,[TotalSet])=1,null,
([Time].[Runnig Total],[Measures].CURRENTMEMBER,
[TotalSet].Item(RANK([Customers].CURRENTMEMBER,[TotalSet])-2)))'
Вот попробую это переделать под себя и посмотреть что получеться.
Что касаеться запросов я их не пешу пока, больно грамостко это мне SQL хватает.

Всеравно спасибо.

Ну я то их руками только в форуме пишу, да в Sample MDX Application, a так я генератор MDX запросов пишу (на C#).
Ну и у тебя получаеться готовый запрос который выполняеться оптимальным образом, а я работаю со всякими глюкующими клиентами типа Excel или OWC и запросы они сами генерят, так что сдесь есть разница. А генератор запросов MDX... меня тоже посешала такая идея, много клевого можно сделать вот только писать его на C или Delphi это блин трудно. Так что я решил пойти по вычесляемым ячейкам. Вот щас пытаюсь написать такую ячейку!
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Вычесляемое поле
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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