25-й, 50-й и 75-й процентиль запроса MDX

У меня есть вопрос, и я не смог найти ответ (ни на этом форуме, ни на другом) Я ищу:

  • Мне нужно рассчитать 25-й процентиль, медиану (50-й процентиль) и 75-й процентиль.

Другими словами: мне нужно написать в запросе MDX в SSRS, чтобы он сказал мне, какие данные являются 25-м, медианным и 75-м.

Все, что я смог найти до сих пор, это не точные значения каждого из них.

спасибо


person Francisco    schedule 18.04.2013    source источник


Ответы (1)


Я работал над той же проблемой для своих собственных данных. Проблема, с которой я столкнулся, заключается в том, чтобы выяснить функцию 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