Я работаю по тому же вопросу для своих собственных данных. Проблема, с которой я столкнулась, заключается в определении функции Median(). Вот как интерпретировать параметры функции:
определение от Microsoft: MEDIAN (Set_Expression [, numeric_expression])
Моя интерпретация: Set_Expression это множество значений, которые определяют зерно, которое суммируется мера до того, как медиана оцениваются
numeric_expression является мерой, которая суммируется, что множество сумм затем сортируются и оцениваются, чтобы найти медиану
в моем случае для нахождения прямой медианы по всем данным как таковых t, я не хотел вообще суммировать значения. Чтобы предотвратить вычисление любых сумм, я использовал ключевой атрибут для измерения с мощностью 1-1 с записями в таблице фактов, содержащей меру, которую я использую. Единственный недостаток, который я видел до сих пор, заключается в том, что иногда медиан возвращает целое число, когда есть четное количество записей, а среднее из двух средних записей должно приводить к числу, оканчивающемуся на .5. Например, значения двух средних записей - 16 и 17, а функция возвращает 17 вместо 16.5. Поскольку это незначительный недостаток, я готов упустить его пока.
Это то, что выглядит мой расчет с медианой функции, как:
WITH MEMBER Measures.[Set Median] AS MEDIAN(
[Dimension].[Key Attribute].MEMBERS
,Measures.[Non-summable Measure]
)
Я использовал комбинацию медианы и TopCount, чтобы получить 75-й процентиль. Я использую TopCount для ограничения набора для медианы ко второй половине данных, поскольку TopCount сортирует данные в порядке убывания. Я объясню, как я понимаю TopCount:
определение от Microsoft: TopCount (Set_Expression, граф [, 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]