T-SQL: агрегатная функция для вычисления N-го процентиля - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь вычислить N-й процентиль всех значений в одном столбце таблицы.Все, что я хочу, - это скалярное агрегированное значение, для которого N процентов значений ниже.Например, если в таблице 100 строк, значение которых совпадает с индексом строки, плюс один (от 1 до 100 последовательно), то я бы хотел, чтобы это значение сообщало мне, что 95% значений ниже 95.

Аналитическая функция PERCENTILE_CONT выглядит ближе всего к тому, что я хочу.Но если я попытаюсь использовать его следующим образом:

SELECT PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY ValueColumn) OVER () AS P95

Я получу по одной строке на строку в таблице, все с одинаковым значением.Я мог бы использовать TOP 1, чтобы просто дать мне одну из этих строк, но теперь я сделал дополнительное сканирование таблицы.

Я не пытаюсь создать таблицу результатов wizbang, разделенную некоторым другим столбцом воригинальный стол.Я просто хочу, чтобы агрегатное скалярное значение.

Edit: I смог использовать PERCENTILE_CONT в запросе с предложением WHERE.Например:

DECLARE @P95 INT

SELECT TOP 1 @P95 = (PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY ValueColumn) OVER ())
FROM ExampleTable
WHERE LOWER(Color) = 'blue'

SELECT @P95

Включение предложения WHERE дает другой результат, чем я получил без него.

1 Ответ

0 голосов
/ 26 февраля 2019

Из того, что я могу сказать, вам нужно сделать здесь подзапрос.Например, чтобы найти количество записей строго ниже 95 процентиля, мы можем попробовать:

WITH cte AS (
    SELECT ValueColumn,
        PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY ValueColumn) OVER () AS P95
    FROM yourTable
)

SELECT COUNT(*)
FROM cte
WHERE ValueColumn < P95;
...