我需要计算包含不同年龄范围的表的列值的中位数,但我无法找到问题的答案。该表的结构如下:
编号 0-5 5-10 11-15 16-20 ... ------------------------------------------ 1 14 5 12 5 ... 2 5 11 14 17 ...
我已经阅读了有关使用行数和聚合来查找数据中位数的信息,但这似乎要求所有数据都在同一列中。因此,我认为我需要在 SQL 中使用 PIVOT 函数,但我无法弄清楚所需的语法。谁能帮我这个?
你真正想要的是一个 UNPIVOT:
SELECT ID, Value, AgeRange
FROM
(SELECT *
FROM ages) pivotedDate
UNPIVOT
(Value FOR AgeRAnge IN
([0-5], [6-10], ...)
) AS Result;
请注意,您必须将所有年龄范围都放在语句中才能返回它们的值。
没有一种方法是真正优雅的。我会去蛮力:
select id,
(case when tot1 >= totn / 2 then 'col1'
when tot2 >= totn / 2 then 'col2'
. . .
) as mediancolumn
from (select t.*,
col1 as Tot1,
col1 + col2 as Tot2,
. . .
(col1 + col2 + . . . coln) as Totn
from t
) t
如果你真的想解析范围,那么同样的想法也成立。但是您需要更改语句的then
一部分case
来处理数值。