mysql - 使用跨表列划分对记录进行排名

标签 mysql sql select

我需要编写一个 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_valueDESC 顺序排列。我现在可以写两个查询:

  • 仅为给定学生选择在 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/

相关文章:

sql - 查找 (Oracle) SQL 中的最后一个重复行

mysql - 如何显示每个类别的数据计数mysql子查询

php - 如何在html标签、javascript和php之间传递变量

php - 提交时登录表单重定向回自身

php - 使用 PHP 将注册商标符号/版权符号插入 MySQL

sql - 为什么不能根据主键调用SQL select?

python - Insert 语句不适用于数据类型不匹配的情况

java - 将java.sql.Timestamp转换为Java 8 ZonedDateTime吗?

sql - 调整/重写具有许多左外连接和重型表的 SQL 查询

mysql - 选择每个对话的最新消息