sql - 如何在 SQL 中获得每个幼儿园最后三个成绩的平均值?
问题描述
我在 SQL 中有两个表。第一个有幼儿园的名称和他们的 ID。第二个表格包括年级 ID、幼儿园 ID、他们的年级和评分日期。我只需要获得每个幼儿园最后三个成绩的平均值。
这些是我的表:
幼儿园|kindergarden_id|kindergarden_name|kindergarden_address|kindergarden_user_id|
kindergarden_grade |grade_id|grade|grade_date|kindergarden_kindergarden_id|
我目前正在尝试这个,通过这个查询,我得到了我所有成绩的平均值,而不是最后三个。
SELECT r.kindergarden_name, AVG(r.grade)FROM (SELECT kindergarden.kindergarden_name, kindergarden_grade.grade from kindergarden left join kindergarden_grade on kindergarden.kindergarden_id=kindergarden_grade.kindergarden_kindergarden_id order by kindergarden_grade.grade_date)as r group by r.kindergarden_name
这是我得到的,这是幼儿园和他们所有成绩的平均值:
柯基犬 3.0000 蝴蝶 4.0000 想象力 2.0000
解决方案
您可以使用窗口函数来获得最后三个成绩:
SELECT k.kindergarden_name, AVG(r.grade)
FROM (SELECT k.kindergarden_name, kg.grade,
ROW_NUMBER() OVER (PARTITION BY k.kindergarden_name ORDER BY kg.grade_date) as seqnum
FROM kindergarden k LEFT JOIN
kindergarden_grade kg
ON k.kindergarden_id = kg.kindergarden_kindergarden_id
) k
WHERE seqnum <= 3
GROUP BY k.kindergarden_name;
编辑:
旧版本的 MySQL 不支持ROW_NUMBER()
。有多种解决方案,但一种是:
SELECT k.kindergarden_name, AVG(r.grade)
FROM kindergarden k LEFT JOIN
kindergarden_grade kg
ON k.kindergarden_id = kg.kindergarden_kindergarden_id
WHERE kg.grade_date >= ANY (SELECT kg2.grade_date
FROM kindergarden_grade kg2
WHERE kg2.kindergarden_kindergarden_id = kg.kindergarden_kindergarden_id
ORDER BY kg2.grade_date DESC
LIMIT 1 OFFSET 2
)
GROUP BY k.kindergarden_name;
这使用子查询返回第三个最新日期。ANY
处理特定幼儿园没有三个日期的情况。
推荐阅读
- arrays - 将相关矩阵转置为 SAS 中的一个长向量
- matlab - 在matlab中求解线性方程组
- c# - CS0246: 找不到类型或命名空间名称“MySql”
- sql - 使用 CASE WHEN 将数字列表添加到查询中
- java - Spark Java - 将 csv 中的 json 转换为映射
- javascript - 在 UWP 中将画布另存为图像
- regex - 提升正则表达式匹配失败
- python - AttributeError:模块'asyncio'没有属性'coroutine'(Python 3.6.4)
- android - 什么版本的 SDK 和 ndk 是 Nougat 的正确版本?
- php - 更新记录中的单个值不使用按钮?