Решение, использующее ранжирование, хорошо работает, когда у вас есть нечетное число членов в каждой группе, то есть медиана существует в пределах выборки, где у вас есть четное число членов, метод рангов будет падать, например.
1
2
3
4
Медиана здесь 2,5 (т.е. половина группы меньше, и половина группы больше), но метод ранга вернется 3. Чтобы обойти это, вы по существу должны принять верхнее значение из нижней половину группы и нижнее значение верхней половины группы, и принять среднее значение из двух значений.
WITH CTE AS
( SELECT Code,
Value,
[half1] = NTILE(2) OVER(PARTITION BY Code ORDER BY Value),
[half2] = NTILE(2) OVER(PARTITION BY Code ORDER BY Value DESC)
FROM T
WHERE Value IS NOT NULL
)
SELECT Code,
(MAX(CASE WHEN Half1 = 1 THEN Value END) +
MIN(CASE WHEN Half2 = 1 THEN Value END))/2.0
FROM CTE
GROUP BY Code;
Example on SQL Fiddle
В SQL Server 2012 можно использовать PERCENTILE_CONT
SELECT DISTINCT
Code,
Median = PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY Value) OVER(PARTITION BY Code)
FROM T;
Example on SQL Fiddle
Возможный дубликат HTTP: //stackoverflow.com/questions/1342898/function-to-calculate-median-in-sql-server – jean
Я не думаю, что ссылка действительно имеет дело с группировкой по второму столбцу. –
В этой связи OP указывает: «Что было бы лучшим способом (если это возможно) сделать это - разрешить вычисление медианного значения (при использовании числового типа данных) в агрегированном запросе?» Обычно это означает, что он плохо использовал группу (AGGREGATE). – jean