sql - 查询考试成绩计算

标签 sql sql-server t-sql group-by

问题陈述:

我有一个 EXAM 表,其中包含以下字段和示例数据

student_id   exam_date   exam_score
-----------------------------------
  a1        2018-03-29    75
  a1        2018-04-25    89
  b2        2018-02-24    91

我想编写一个 SQL 查询来输出以下字段

 1. student_id
 2. exam_date
 3. highest_score_to_date
 4. average_score_to_date
 5. highest_exam_score_ever

我的 SQL 查询:

select
  a.student_id,
  b.exam_date,
  highest_exam_score_to_date,
  average_exam_score_to_date,
  highest_exam_score_ever
from
(
   select
     student_id,
     exam_date,
     max(score) as highest_exam_score_to_date,
     avg(score) as average_exam_score_to_date
  from exam
  group by
    student_id,
    exam_date
) a

left join

(
  select
     student_id,
     max(score) as highest_exam_score_ever
  from exam
  group by
     student_id
) b
on a.student_id = b.student_id

我可以通过编写更好的 SQL 查询来实现我的结果吗?

最佳答案

您确实可以将表与多个聚合子查询连接起来,这些子查询计算学生和考试级别的相关值。

但是使用窗口函数似乎更简单:

select 
    t.*,
    max(exam) over(partition by student_id order by exam_date) highest_score_to_date,
    avg(exam) over(partition by student_id order by exam_date) average_score_to_date,
    max(exam) over(partition by student_id) highest_score_ever
from mytable t

关于sql - 查询考试成绩计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60478398/

相关文章:

sql-server - 将整数序列转置到表中

sql - NHibernate 查询与距离计算存储过程

mysql - 在mysql中转换mssql触发器

c# - SQL 标识增量和种子

sql-server - 表示 DATETIME 值的整数 : how to convert?

sql - SQL合并中发生无意的交叉连接

MySql 将更新与内连接和限制相结合

sql - redshift 改变 udf 更改所有者

.net - .NET 十进制到 SQL Server 十进制的良好映射是什么?

sql返回嵌套结果集?