我需要编写一个 SQL 查询,它根据不同表中列的两个派生值的除法来获取排名记录。因此,表 1 有一个列 A,表 2 有一个列 B,两个表都有共同的 school_id
。表 A 中的数据如下所示:
school_id | student_id | subject_id | marks
123 ABC 7Y8U 94
234 UHT 4Y8U 87
123 ABC 8P0F 49
567 FCV 5Q1U 70
B表中的数据如下:
school_id | prize_amt
123 3000
234 4700
123 8210
567 3200
我需要做的计算是:
required_value = total marks per school per student / number of times that school is awarded
我需要 n
条记录,根据 required_value
按 DESC
顺序排列。我现在可以写两个查询:
- 仅为给定学生选择在 DESC 顺序中具有相应最高总分的不同学校
- 选择学校按 DESC 顺序授予的次数
如何获得根据上面定义的 required_value
排名的多条记录?期望的结果将是:
school_id | required_value
234 87
123 71.50
567 70
因此,ID 为 123
的学校的分数为 94 + 49 = 143,并且获得了 2 次奖励,因此其 required_value
值为 143/2 = 71.50。
最佳答案
我会使用两个聚合查询,一个用于对每所学校的分数求和,一个用于计算奖励,将它们加入学校 ID 并划分结果:
SELECT a.school_id, sum_marks / num_awards
FROM (SELECT school_id, SUM(marks) AS sum_marks
FROM a
GROUP BY school_id) a
JOIN (SELECT school_id, COUNT(*) AS num_awards
FROM b
GROUP BY school_id) b ON a.school_id = b.school_id
ORDER BY 2 DESC
关于mysql - 使用跨表列划分对记录进行排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51335848/