2017-01-24 77 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