计算 PieCloudDB 中的百分比排名

问题描述 投票:0回答:1

我有一个学生表:

学生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

sql rank
1个回答
0
投票

我查了一些文档,在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;
© www.soinside.com 2019 - 2024. All rights reserved.