2017-01-24 3 views
0

У меня есть таблица Vertica, которая содержит данные, такие какМедиана распределения частот в Vertica

num_emails num_users 
1   1000 
10   100 
25   50 

Где (1, 1000) означает, 1000 пользователей получили 1 электронную почту. Медиана этого распределения равна 1.

Каков наилучший способ сделать это в SQL/Vertica? Я посмотрел на https://my.vertica.com/docs/7.1.x/HTML/Content/Authoring/SQLReferenceManual/Functions/Analytic/MEDIANAnalytic.htm, но, похоже, это работает, только если столбец повторяется n раз (в отличие от строки (column_val, n)).

+1

Какой ожидаемый выход? данные, которые вы смотрите, я предполагаю, агрегируются. просто используйте строки из исходной таблицы для вычисления медианы. –

ответ

1

Вы можете использовать накопленную сумму и арифметику:

select avg(num_emails) 
from (select t.*, sum(num_users) over (order by num_emails) as running_num_users, 
      sum(num_users) over() as total_num_users 
     from t 
    ) t 
where (running_num_users - num_users) * 2 <= total_num_users and 
     running_num_users * 2 >= total_num_users; 

Логика здесь, чтобы получить точку, где общая сумма, составляет половину от общего количества. avg() - это потому, что это некоторые особые случаи, я думаю, что две записи могут удовлетворять условиям - если есть четное число пользователей, а медиана - между двумя группами.

0

Я уверен, что это не окончательный ответ - я не думаю, что вы предоставили правильные данные образца. Я попытался как можно медиана (выражения), и они на самом деле не показывают много информации:

WITH input(num_emails,num_users) AS (
      SELECT 1,1000 
UNION ALL SELECT 10,100 
UNION ALL SELECT 25,50 
) 
SELECT 
    * 
, MEDIAN(num_users) OVER() AS median_users 
, MEDIAN(num_emails) OVER() AS median_emails 
FROM input; 

num_emails|num_users|median_users|median_emails 
     1| 1,000|   100|   10 
     10|  100|   100|   10 
     25|  50|   100|   10 

Вы можете поставить данные, которые мы можем играть с?

Marco the Sane

+0

забудьте об этом - потребовалось время, чтобы понять, что вам нужно - я думаю, что Гордон Линофф - это тот, на кого вы должны смотреть ... – marcothesane