2017-03-05 48 views
0

我需要在Netezza中實現以下PostgreSQL代碼。這基本上計算離散值的直方圖數據的百分位數。 Postgres的問題被問及並回答了here來自離散值的直方圖數據的百分位數

CREATE TABLE grades 
AS 
    SELECT name, exams, grade_poor, grade_fair, grade_good, grade_vgood 
    FROM (VALUES 
    ('arun' , 8 , 1 , 4 , 2 , 1), 
    ('neha' , 10 , 3 , 2 , 1 , 4), 
    ('ram' , 5 , 1 , 1 , 3 , 0), 
    ('radha' , 8 , 0 , 3 , 1 , 4) 
) AS t(name,exams,grade_poor,grade_fair,grade_good,grade_vgood); 

SELECT name, percentile_disc(0.5) WITHIN GROUP (ORDER BY gs1.x) 
FROM (
    SELECT name, 
    ARRAY[grade_poor, grade_fair, grade_good, grade_vgood] 
    FROM grades 
) AS t(name, grades) 
CROSS JOIN LATERAL generate_series(1,4) AS gs1(x) 
CROSS JOIN LATERAL generate_series(1,grades[gs1.x]) AS gs2(x) 
GROUP BY name ORDER BY name; 

代碼可以跑here

得到的輸出

name | percentile_disc 
-------+----------------- 
arun |    2 
neha |    2 
radha |    3 
ram |    3 

回答

1

我相信Netezza公司支持percentile_disc()。所以,主要的問題是unpivoting數據:

SELECT name, percentile_disc(0.5) WITHIN GROUP (ORDER BY grade) 
FROM ((SELECT name, grade_poor as grade 
     FROM grades 
    ) UNION ALL 
     (SELECT name, grade_fair as grade 
     FROM grades 
    ) UNION ALL 
     (SELECT name, grade_good as grade 
     FROM grades 
    ) UNION ALL 
     (SELECT name, grade_vgood as grade 
     FROM grades 
    ) 
    ) g 
GROUP BY name 
ORDER BY name; 
+0

這爲等級「數」的第50個百分點,但在這個問題的想法是有品位「價值」的第50個百分點 - 看到問題的輸出。 – user3206440