25-й процентиль для нескольких столбцов - PullRequest
1 голос
/ 09 ноября 2010

Допустим, у меня есть таблица со столбцами A, B, C, D, E и т. Д., Где каждый столбец представляет собой int. Эта таблица заполнена сотнями строк со случайными значениями в каждом столбце. Каков оптимальный способ вернуть значение, соответствующее 25-му процентилю для каждого столбца?

Например:

A B C D E
1 5 8 9 3
3 6 5 0 2
8 3 6 1 8
4 1 8 3 1
7 2 2 6 9

Здесь столбец A состоит из значений 1, 3, 4, 8 и 7. 25-й процентиль для этого набора должен быть 3 . Столбец B состоит из значений 1, 2, 3, 5 и 6. 25-й процентиль для этого набора должен быть 2 . C равно 5 , D равно 1 , а E равно 2 . Поскольку имеется 5 строк, 25-й процентиль является просто вторым наименьшим значением. Если бы было 40 строк, это было бы 10-е наименьшее значение. Как я могу эффективно написать запрос, который возвращает:

A B C D E
3 2 5 1 2

Что я пробовал:

WITH 
    ATable as (
        SELECT A, CAST(NTILE(100) OVER (ORDER BY A) as int) as Percentile
        FROM MyTable
    ),
    BTable as (
        SELECT B, CAST(NTILE(100) OVER (ORDER BY B) as int) as Percentile
        FROM MyTable
    ),
    ...
SELECT
    (SELECT TOP 1 A FROM ATable where Percentile = 25) as A,
    (SELECT TOP 1 B FROM BTable where Percentile = 25) as B,
    ...

У меня около 40 таких столбцов, и мой опыт работы с моим набором данных и NTILE с таким количеством столбцов, производительность становится серьезной проблемой. У кого-нибудь есть идея получше?

Ответы [ 2 ]

2 голосов
/ 09 ноября 2010

Ваше решение верное. Я не вижу более неожиданного решения.

Вам нужна отдельная строка для столбца , поэтому вам нужно запрашивать каждый столбец отдельно. Если у вас 40 столбцов, то это 40 CTE, соединенных вместе. Простой.

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

0 голосов
/ 09 ноября 2010

Я не уверен, актуальна ли следующая статья для текущих версий сервера MS SQL, но вы можете проверить это

Лучше NTILE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...