2014-09-02 4 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 нет встроенной медианы, вам придется выполнить ее несколькими шагами: получить количество строк в результирующем наборе, выяснить среднюю точку и найти медиану. –

ответ

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

Смежные вопросы