【问题标题】:Calculating the Median Across Columns of a Table计算表格各列的中位数
【发布时间】:2013-02-20 04:22:19
【问题描述】:

我需要计算包含不同年龄范围的表格列值的中位数,但我无法找到问题的答案。该表的结构如下:

编号 0-5 5-10 11-15 16-20 ... ------------------------------------------ 1 14 5 12 5 ... 2 5 11 14 17 ...

我读过有关使用行数和聚合来查找数据中位数的信息,但这似乎要求所有数据都在同一列中。因此,我认为我需要在 SQL 中使用 PIVOT 函数,但我无法弄清楚所需的语法。谁能帮我解决这个问题?

【问题讨论】:

  • 您希望得到的结果是什么样的?

标签: sql pivot median


【解决方案1】:

你真正想要的是一个 UNPIVOT:

SELECT ID, Value, AgeRange
FROM 
   (SELECT *
   FROM ages) pivotedDate
UNPIVOT
   (Value FOR AgeRAnge IN 
      ([0-5], [6-10], ...)
) AS Result;

请注意,您必须将所有年龄范围都放在语句中才能返回它们的值。

【讨论】:

  • 感谢您出色地实现了我需要的值的旋转。
【解决方案2】:

没有真正优雅的方法。我会选择蛮力:

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

如果你真的想解析范围,那么同样的想法也成立。但是您需要更改case 语句的then 部分来处理数值。

【讨论】:

  • 虽然 Kyle 的方法确实为我提供了如何旋转我需要的列的一个很好的实现,但数据最终更容易从中间值中强制出来。谢谢戈登。
猜你喜欢
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
  • 1970-01-01
相关资源
最近更新 更多