【问题标题】:Calculate Median with SQL (DB2)使用 SQL 计算中位数 (DB2)
【发布时间】:2014-10-27 04:17:47
【问题描述】:

我在计算结果集的中位数时遇到问题,我需要一些帮助。我需要提供中位数、最大值、最小值、平均值和标准差。有 222 行可能或多或少,我不确定到目前为止我所拥有的是计算中位数的准确方法。这是我的查询。

    Select 
    min(nodes) as min_nodes
    ,max(nodes) as max_nodes
    ,avg(nodes) as avg_nodes
    ,max(nodes) + min(nodes))/2 as median_nodes
    ,stddev(nodes) as sd_nodes
    from Table

【问题讨论】:

  • 除非 db2 内置了中值函数,否则您必须分多个步骤来处理它:获取结果集中的行数,找出中点,然后就是中值。

标签: sql db2 aggregate-functions median


【解决方案1】:

您可以使用窗口函数来做到这一点:

Select min(nodes) as min_nodes, max(nodes) as max_nodes, avg(nodes) as avg_nodes,
       avg(case when 2*seqnum in (cnt, cnt - 1, cnt + 1) then nodes end) as median_nodes,
       stddev(nodes) as sd_nodes
from (select t.*, row_number() over (order by nodes) as seqnum,
             count(*) over () as cnt
      from table t
     ) t

avg() 的用途是处理具有偶数个值的情况。在这种情况下,中位数传统上分配给两个中间值的中点。

【讨论】:

    【解决方案2】:

    这是计算中位数的一种方法:

    select avg(nodes)
    from (
        select nodes
             , row_number() over(order by nodes asc) as rn1
             , row_number() over(order by nodes desc) as rn2
        from table
    ) as x(nodes, rn1, rn2)
    where rn1 in (rn2, rn2 - 1, rn2 + 1)
    

    枚举两个方向的节点是一种优化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-11
      • 1970-01-01
      • 1970-01-01
      • 2020-03-20
      • 2011-01-14
      • 2012-10-28
      • 1970-01-01
      相关资源
      最近更新 更多