2017-01-24 40 views
0

的频度分布的我有一个包含像平均在Vertica的

num_emails num_users 
1   1000 
10   100 
25   50 

数据在哪里(1,1000)指1000级的用户接收到的1个电子邮件一个Vertica的表。 此分布的中位数为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