我有一个学生表:
学生id | 部门_id | 标记 |
---|---|---|
4 | 2 | 608 |
2 | 2 | 500 |
8 | 2 | 608 |
7 | 1 | 618 |
11 | 1 | 580 |
1 | 1 | 620 |
3 | 1 | 593 |
我想以百分比形式报告每个学生在其系中的排名,其中百分比排名是使用以下公式计算的:
(student_rank_in_the_department - 1) * 100 / (number_of_students_in_the_department - 1)
。百分比应四舍五入至小数点后两位。如果两个学生获得相同的分数,他们也会获得相同的排名。
我在 PieCloudDB 数据库中尝试了以下操作:
SELECT student_id ,department_id ,
COALESCE(ROUND((rk-1)*100.0/(cnt-1),2),0) percentage
FROM(
SELECT student_id ,department_id ,RANK() OVER (PARTITION BY department_id ORDER BY mark DESC) rk ,
COUNT(student_id) OVER (PARTITION BY department_id) cnt
FROM Students
) a
ORDER BY department_id;
并得到了正确的结果:
学生id | 部门_id | 标记 |
---|---|---|
1 | 1 | 0.00 |
7 | 1 | 33.33 |
3 | 1 | 66.67 |
11 | 1 | 100.00 |
4 | 2 | 0.00 |
8 | 2 | 0.00 |
2 | 2 | 100.00 |
我现在了解到有一个功能
PERCENT_RANK()
可以直接实现我的要求,于是我尝试了一下:
SELECT student_id, department_id,
ROUND((PERCENT_RANK() OVER (PARTITION BY department_id ORDER BY mark DESC)) * 100, 2) AS percentage
FROM Students
ORDER BY department_id;
但我不知道为什么我收到错误:
function round(double precision, integer) does not exist
。
我查了一些文档,在PieCloudDB数据库中,
ROUND()
中的参数类型是numeric
,我将数据类型转换为numeric
后,就可以正常执行了。
SELECT student_id, department_id,
ROUND((PERCENT_RANK() OVER (PARTITION BY department_id ORDER BY mark DESC))::numeric * 100, 2) AS percentage
FROM Students
ORDER BY department_id;