Вы можете попробовать это:
SELECT PatientType, minutes1=(
SELECT AVG(1.0 * minutes1)
FROM
(
SELECT t3.minutes1, rn = ROW_NUMBER() OVER (ORDER BY t3.minutes1), c.c
FROM (SELECT minutes1 FROM Table t2 WHERE t1.PatientType=t2.PatientType) t3
CROSS JOIN (SELECT c = COUNT(*) FROM (SELECT minutes1 FROM Table t2 WHERE t1.PatientType=t2.PatientType) t4) AS c
) AS x
WHERE rn IN ((c + 1)/2, (c + 2)/2)
), minutes2=(
SELECT AVG(1.0 * minutes2)
FROM
(
SELECT t3.minutes2, rn = ROW_NUMBER() OVER (ORDER BY t3.minutes1), c.c
FROM (SELECT minutes2 FROM Table t2 WHERE t1.PatientType=t2.PatientType) t3
CROSS JOIN (SELECT c = COUNT(*) FROM (SELECT minutes2 FROM Table t2 WHERE t1.PatientType=t2.PatientType) t4) AS c
) AS x
WHERE rn IN ((c + 1)/2, (c + 2)/2)
), minutes3=(
SELECT AVG(1.0 * minutes1)
FROM
(
SELECT t3.minutes3, rn = ROW_NUMBER() OVER (ORDER BY t3.minutes1), c.c
FROM (SELECT minutes3 FROM Table t2 WHERE t1.PatientType=t2.PatientType) t3
CROSS JOIN (SELECT c = COUNT(*) FROM (SELECT minutes3 FROM Table t2 WHERE t1.PatientType=t2.PatientType) t4) AS c
) AS x
WHERE rn IN ((c + 1)/2, (c + 2)/2)
), minutes4=(
SELECT AVG(1.0 * minutes4)
FROM
(
SELECT t3.minutes1, rn = ROW_NUMBER() OVER (ORDER BY t3.minutes1), c.c
FROM (SELECT minutes4 FROM Table t2 WHERE t1.PatientType=t2.PatientType) t3
CROSS JOIN (SELECT c = COUNT(*) FROM (SELECT minutes4 FROM Table t2 WHERE t1.PatientType=t2.PatientType) t4) AS c
) AS x
WHERE rn IN ((c + 1)/2, (c + 2)/2)
), minutes5=(
SELECT AVG(1.0 * minutes5)
FROM
(
SELECT t3.minutes1, rn = ROW_NUMBER() OVER (ORDER BY t3.minutes1), c.c
FROM (SELECT minutes5 FROM Table t2 WHERE t1.PatientType=t2.PatientType) t3
CROSS JOIN (SELECT c = COUNT(*) FROM (SELECT minutes5 FROM Table t2 WHERE t1.PatientType=t2.PatientType) t4) AS c
) AS x
WHERE rn IN ((c + 1)/2, (c + 2)/2)
)
FROM Table t1
GROUP BY PatientType
и есть, вероятно, гораздо лучше, и это, вероятно, может быть оптимизирован совсем немного.
Легко, нет. Но это может быть сделано. Вы можете использовать PERCENTILE_DISC, но это было недоступно до 2012 года. Даже тогда я не уверен, является ли это истинной медианной или использует ближайшее меньшее значение в четных наборах. Например, если значения «1,3,5,7' являются медианными, это 4, но 3 будет достаточно близко для вас? –
В прошлом я использовал PERCENTILE_DISC или PERCENTILE_CONT, но они полезны только в 2012 году или выше. Кроме того, мне нужна настоящая медиана. – NonProgrammer