2017-03-05 4 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

실행 결과 출력 내가 네티가 percentile_disc()을 지원하는 생각

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

답변

1

입니다 수 있습니다. 그래서 큰 문제는 데이터 unpivoting되어이 성적 "수"에 대한 50 번째 백분위 수를 제공

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 번째 백분위 수를 가지고 있었다 - 문제의 결과를 볼 수 . – user3206440