2014-09-02 195 views
1

我遇到了計算結果集中位數的問題,可以使用一些幫助。我需要提供中值,最大值,最小值,平均值和標準偏差。有222行可以更多或更少,我不確定我到目前爲止是計算中位數的準確方法。這是我的查詢。用SQL計算中位數(DB2)

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 
+2

除非db2具有內置的中值函數,否則您需要多個步驟:獲取結果集中的行數,找出中點,並確定您的中位數。 – 2014-09-02 19:48:30

回答

1

這裏的計算中位數的一種方法:

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) 

枚舉節點在兩個方向上是一種優化。

2

您可以使用窗口函數做到這一點:

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()是處理,你有偶數個值的情況。在這種情況下,中位數傳統上被分配到兩個中間值的中點。

+0

這兩個答案的工作。謝謝 – Tone 2014-09-02 20:15:42