Допустим, у меня есть таблица со столбцами 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 с таким количеством столбцов, производительность становится серьезной проблемой. У кого-нибудь есть идея получше?