我有一个包含
等数据的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))时才有效。
答案 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