Я работал над той же проблемой для своих собственных данных. Проблема, с которой я столкнулся, заключается в том, чтобы выяснить функцию Median(). Вот как я интерпретирую параметры функции:
Определение Microsoft: MEDIAN(Set_Expression [, Numeric_Expression])
Моя интерпретация: Set_Expression — это набор значений, определяющих зерно, к которому суммируется мера до оценки медианы.
Numeric_Expression — это суммируемая мера, набор сумм которой затем сортируется и оценивается для нахождения медианы.
В моем случае для нахождения прямой медианы по всему набору данных я вообще не хотел суммировать значения. Чтобы предотвратить вычисление каких-либо сумм, я использовал ключевой атрибут для измерения, которое имело кардинальность 1-1 с записями в таблице фактов, содержащей меру, которую я использую. Единственный недостаток, который я видел до сих пор, заключается в том, что иногда медиана возвращает целое число, когда имеется четное количество записей, а среднее значение двух средних записей должно давать число, оканчивающееся на 0,5. Например, значения двух средних записей — 16 и 17, а функция возвращает 17 вместо 16,5. Так как это незначительный недостаток, я готов пока не обращать на него внимания.
Вот как выглядит мой расчет с медианной функцией:
WITH MEMBER Measures.[Set Median] AS MEDIAN(
[Dimension].[Key Attribute].MEMBERS
,Measures.[Non-summable Measure]
)
Я использовал комбинацию Median и TopCount, чтобы получить 75-й процентиль. Я использую TopCount, чтобы ограничить набор для медианы второй половиной данных, поскольку TopCount сортирует данные в порядке убывания. Я объясню, как я понимаю TopCount:
Определение Microsoft: TopCount(Set_Expression, Count [, Numeric_Expression])
Моя интерпретация: Set_Expression — это набор значений, из которых будет возвращено желаемое количество кортежей.
Count — это количество кортежей, которые нужно вернуть из набора.
Numeric_Expression — это значение, которое будет использоваться для сортировки набора в порядке убывания.
Я хочу, чтобы функция Median использовала последнюю половину записей в таблице фактов, которые возвращаются в запросе, поэтому я снова использую ключ для таблицы измерений, которая имеет мощность 1-1 с таблицей фактов, и я сортирую ее по мера, из которой я хочу найти медианное значение.
Вот как я закодировал член:
MEMBER Measures.[75th Percentile] AS MEDIAN(
TOPCOUNT(
[Dimension].[Key Attribute].MEMBERS
,Measures.[Fact Table Record Count] / 2
,Measures.[Non-summable Measure]
)
,Measures.[Non-summable Measure]
)
На данный момент эта комбинация функций вернула настоящий 75-й процентиль из моего набора данных. Чтобы получить 25-й процентиль, я попытался заменить TOPCOUNT в своем коде на BOTTOMCOUNT, который должен делать то же самое, только сортируя данные в порядке возрастания, чтобы использовать первую половину записей вместо второй половины. К сожалению, из этой комбинации функций мне не удалось получить ничего, кроме NULL, поэтому я открыт для предложений о том, как получить 25-й процентиль.
Вот как выглядит мой окончательный запрос:
SELECT
{
Measures.[Set Median]
,Measures.[25th Percentile]
,Measures.[75th Percentile]
} ON 0
,[Dimensional row members here] ON 1
FROM [Cube]
WHERE
[Non-axis dimensional filter members here]
person
Ryan Schmitz
schedule
15.05.2014