vertica中频率分布的中位数

时间:2017-01-24 20:43:00

标签: sql vertica

我有一个包含

等数据的vertica表
{{1}}

其中(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))时才有效。

2 个答案:

答案 0 :(得分: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()是因为是一些特殊情况,我认为两条记录可以满足条件 - 如果有偶数用户且中位数在两组之间。

答案 1 :(得分:0)

我确定这不是最终答案 - 我认为您没有提供正确的样本数据。我尝试了两种可能的MEDIAN()表达式,但它们并没有真正揭示很多信息:

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