Владимир Штепа
Member
Откуда: Hannover
Сообщений: 5676
|
Дискуссия на эту тему возникла спонтанно в другом топике. Я вынес это в отдельную тему
| backfire |
Коль пошла речь о рекурсии, то можно ли еще в AS2K в следующем запросе Избежать ненужных вычислений, переписав формулу для RunningTotal чтобы AS считал a la Excel, a не a la SQL.
WITH
-- Runnig Total
member [Time].[Column 2] as '
SUM(HEAD([TotalSet],RANK([Customers].CURRENTMEMBER,[TotalSet])),
([Time].[1998],[Measures].CURRENTMEMBER))'
SET [RowSet0] AS '{[Customers].[City].members}'
-- Sort
SET [RowSet2] AS 'topcount([RowSet0],100,([Time].[1998], [Measures].[Store Sales]))'
SET [TotalSet] AS '[RowSet2]'
member [Customers].[TotalMember] AS '[Customers].[All Customers]'
SELECT
{[Time].[1998],[Time].[Column 2]} ON COLUMNS,
CROSSJOIN({[RowSet2]},{[Measures].[Store Sales]})
ON ROWS
FROM Sales |
то есть, как переписать формулу
member [Time].[Column 2] as '
SUM(HEAD([TotalSet],RANK([Customers].CURRENTMEMBER,[TotalSet])),
([Time].[1998],[Measures].CURRENTMEMBER))' |
к виду (
member [Time].[Column 2] as '([Time].[1998],[Measures].CURRENTMEMBER) +
Предыдущий([Time].[Column 2])'
|
Возможно ли тут каким либо образом, притянув CalculationPass решить проблему.
Проблема в том что потребное время для выполнения
member [Time].[Column 2] as '
SUM(HEAD([TotalSet],RANK([Customers].CURRENTMEMBER,[TotalSet])),
([Time].[1998],[Measures].CURRENTMEMBER))' |
пропорционально квадрату количества мемберов в [TotalSet] |
| Mosha | Да, конечно можно - это стандартная задача, и можно применить рекурсию. Посколько рекурсия в этом случае не бесконечная, то у AS2K нет с этим никаких проблем и CalculationPassValue не нужен.
Моша ---------------------------------------------------- This posting is provided "AS IS" with no warranties, and confers no rights |
| backfire | | Mosha | Да, конечно можно - это стандартная задача, и можно применить рекурсию. Посколько рекурсия в этом случае не бесконечная, то у AS2K нет с этим никаких проблем и CalculationPassValue не нужен.
Моша ---------------------------------------------------- This posting is provided "AS IS" with no warranties, and confers no rights |
Если это стандартная задача, то об этом должно быть где то написано, примеры приведены. Но я почему то невстречал :-(
Ну а у меня вот что наваялось.
WITH
-- Runnig Total
-- a)
member [Time].[Column 2] as '
SUM(HEAD([TotalSet],RANK([Customers].CURRENTMEMBER,[TotalSet])),
([Time].[1998],[Measures].CURRENTMEMBER))'
-- b)
member [Time].[Column 3] as '([Time].[1998],[Measures].CURRENTMEMBER,[Customers].CURRENTMEMBER) +
Iif(RANK([Customers].CURRENTMEMBER,[TotalSet])=1,null,
([Time].[Column 3],[Measures].CURRENTMEMBER,[TotalSet].Item(RANK([Customers].CURRENTMEMBER,[TotalSet])-2)))'
-- c)
member [Time].[Column 4] as '([Time].[1998],[Customers].CURRENTMEMBER) +
Iif(RANK([Customers].CURRENTMEMBER,[TotalSet])=1,null,
([Time].[Column 4],[TotalSet].Item(RANK([Customers].CURRENTMEMBER,[TotalSet])-2)))'
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
{[Time].[1998],[Time].[Column 2], [Time].[Column 3], [Time].[Column 4]} ON COLUMNS,
CROSSJOIN({[RowSet2]},{[Measures].[Store Sales]})
ON ROWS
FROM Sales |
эффект от вариантов в) и с) как и ожидалось, рассчитывается гораздо быстрее чем а)
Принципиально ли различие в написании в) и с)? Можно ли обойтись без использования RANK? Оно конечно не мешает, но выглядит как то коряво... Не покажете ли более "красивый" вариант, если он существует. |
| Mosha | В Вашем примере running sum по customers это для примера или действительно надо. Как то обычно running sum делают по времени. А вообще-то конечно у Вас все очень переусложнено, можно сделать гораздо проще и никаких Rank не нужно. Хотя с другой стороны, Вы не сформулиров задачи сразу стали приводить варианты решения, поэтому я не уверен чего именно Вы хотите добиться. И еще, навеное это надо бы в другой thread, а то Дмитрий обидится - влезли мы в его дискуссию и обсуждаем вещи никак не связанные с его вопросом...
Моша ---------------------------------------------------- This posting is provided "AS IS" with no warranties, and confers no rights |
|