2015-01-08 1 views
0

Я хочу рассчитать, сколько (процентов) людей было хуже, чем я сделал на своих тестах.процентиль баллов, сколько людей хуже, чем вы сделали postgresql

Вот результат я хочу иметь:

student | vak | resultaat | percentielscore 
---------+----------+-----------+----------------- 
1000001 | IBUI | 5.1 | 0 
1000001 | ILNUX1| 3.4 | 0 
1000001 | IMUML | 6.9 | 0 
1000001 | IRDB | 2.5 | 0 
1000002 | IARCH | 7.8 | 0 
1000002 | ICOM | 5.6 | 0 
1000002 | INST | 6.2 | 0 
1000002 | IRDB | 7.2 | 100 
1000003 | IARCH | 7.8 | 0 
1000003 | ILNUX1| 7.4 | 33 
1000003 | IMUML | 6.9 | 0 
1000003 | INST | 6.2 | 0 
1000003 | IRDB | 3.5 | 25 
1000004 | IBUI | 9.5 | 100 
1000004 | ICOM | 5.6 | 0 
1000004 | ILNUX1| 7.4 | 33 
1000004 | IRDB | 3.5 | 25 
1000005 | ILNUX1| 7.4 | 33 
1000005 | IMHTB | 4.2 | 
1000005 | IMUML | 6.9 | 0 
1000005 | INST | 6.2 | 0 
1000005 | IRDB | 4.8 | 75 

Я просто не имею понятия, как подойти к этому, прибегая к помощи процентиль результатов всегда заканчивается чем-то вроде этого:

student | vak | resultaat | percentielscore 
---------+----------+-----------+----------------- 
"1000001";"ILNUX1 ";2.9; 2.40 
"1000001";"IMUML ";6.4; 5.29 
"1000001";"IBUI ";4.6; 3.80 
"1000001";"IRDB ";2.0; 1.65 
"1000002";"INST ";5.7; 4.71 
"1000002";"IARCH ";7.3; 6.03 
"1000002";"IRDB ";6.7; 5.54 
"1000002";"ICOM ";5.1; 4.21 
"1000003";"IMUML ";6.4; 5.29 
"1000003";"IRDB ";3.0; 2.48 
"1000003";"INST ";5.7; 4.71 
"1000003";"IARCH ";7.3; 6.03 
"1000003";"ILNUX1 ";6.9; 5.70 
"1000004";"IRDB ";3.0; 2.48 
"1000004";"ILNUX1 ";6.9; 5.70 
"1000004";"ICOM ";5.1; 4.21 
"1000004";"IBUI ";9.0; 7.44 
"1000005";"IRDB ";4.3; 3.55 
"1000005";"ILNUX1 ";6.9; 5.70 
"1000005";"IMUML ";6.4; 5.29 
"1000005";"IMHTB ";3.7; 3.06 
"1000005";"INST ";5.7; 4.71 

любой идеи?

+0

Не могли бы вы отредактировать вопрос, чтобы включить SQL, с которым вы столкнулись, чтобы получить второй пример? – IMSoP

ответ

2

Вы можете просто использовать подсчет прокачки. Так что если вы хотите, чтобы вычислить сколько (процентов) людей сделали хуже, то я сделал на моих тестах использовать этот запрос:

with cte as (
    select 
     student, vak, resultaat, percentielscore, 
     count(*) over(partition by vak, resultaat) as result_count, 
     count(*) over(partition by vak order by resultaat) as rolling_count, 
     count(*) over(partition by vak) as total_count 
    from Table1 
    order by vak 
) 
select 
    student, vak, resultaat, percentielscore, 
    (rolling_count - result_count) * 100.0/total_count as percentielscore2 
from cte 
order by student, vak 

sql fiddle demo

Но результаты не совсем так же, как и ваши результаты, потому что, с моей точки зрения, ваши результаты не показывают , сколько (процентов) людей было хуже, чем я сделал на своих тестах, проверьте, например, тест ILNUX1 - есть 4 человека, 3 из них 7,4, и у каждого 3,4, как процентные проценты d 33?

+0

Однако ваш запрос не мог сработать (я думал, что в то время мой вопрос был ясен, но, похоже, это не так) благодарит вас за ответ, это заставило меня задуматься и получить меня намного дальше! – Randy

1

застроить часть запроса по частям т.е. вам нужно знать число людей с худшим счетом, то число других берущего тестом, а затем объединить эти два с присоединиться ...

SELECT s.student, 
s.vak, 
s.resultaat, 
worse_score_count, 
number_of_tests, 
COALESCE(worse_score_count,0)/number_of_tests::double precision as percentiel 
FROM 
percentages s 

INNER JOIN LATERAL -- use a lateral query to only count the other students 

-- get the total number of tests by other students 
    (SELECT vak,count(*) AS number_of_tests 
    FROM percentages 
    where student <> s.student 
    GROUP BY vak) t 
ON t.vak = s.vak 

LEFT JOIN 

-- get the number of students with worse test scores 
    (SELECT p1.student,p1.vak,count(*) AS worse_score_count 
    FROM percentages p1 
    INNER JOIN percentages p2 ON p1.vak = p2.vak AND p2.percentielscore <p1.percentielscore 
    GROUP BY p1.student,p1.vak) w 
ON w.student = s.student and w.vak = s.vak 
ORDER by s.student,s.vak 
+0

Однако ваш запрос не мог сработать (я думал, что мой вопрос был ясен в то время, но, похоже, это не так) благодарит вас за ответ, это заставило меня задуматься и получить меня намного дальше! – Randy

 Смежные вопросы

  • Нет связанных вопросов^_^