请教一条 sql 的写法

2017-04-05 20:47:52 +08:00
 uuweZhou
### 以下数据结构,你如何查询某一日期或之前,学生在某年级的单科最新成绩分数,按学生姓名进行排正序取 10 条,请写 SQL 。在特定日期、每个学生在同一年级、同一学科只返回一条成绩数据。查询时,如果特定日期没有成绩数据,则需要返回这个日期之前的最新(离特定日期最近)成绩数据。


| 科目 | 年级 | 学生 | 成绩日期 | 成绩分数 |
| ---- | ---- | ---- | ---------- | ---- |
| 语文 | 1 | 张三 | 2015-01-03 | 100 |
| 语文 | 1 | 李四 | 2015-01-03 | 80 |
| 语文 | 1 | 张三 | 2015-01-05 | 80 |
| 语文 | 1 | 李四 | 2015-01-05 | 90 |
| 数学 | 1 | 张三 | 2015-01-04 | 80 |

提醒:如果要取 2015-01-05 的数据,要求得到张三的语文 1 年级成绩为 80 分,李四的语文 1 年级成绩为 90 分,张三的数学成绩为 80 分。要考虑到在同一天、同一学科、同一年级不是所有学生都有成绩。执行 SQL 查询需要得到的结果如下:


| 科目 | 年级 | 学生 | 成绩日期 | 成绩分数 |
| ---- | ---- | ---- | ---------- | ---- |
| 语文 | 1 | 李四 | 2015-01-05 | 90 |
| 数学 | 1 | 张三 | 2015-01-05 | 80 |


我的思路是:case when + group by

求解~
2878 次点击
所在节点    程序员
21 条回复
luckylion
2017-04-07 14:32:23 +08:00
select * from
(select * from `成绩` where `成绩日期` <= '2015-01-05' order by `成绩日期` desc)
as a GROUP BY 学生,科目,年级
ORDER BY `学生` limit 10

| 科目 | 年级 | 学生 | 成绩日期 | 成绩分数 |
| ---- | ---- | ---- | ---------- | ---- |
| 数学 | 1 | 张三 | 2015-01-04 | 80 |
| 语文 | 1 | 张三 | 2015-01-05 | 80 |
| 语文 | 1 | 李四 | 2015-01-05 | 90 |


--------------------------------------------------------------------------------------------------------
如果是筛选 10 位同学,外层还需再套一层 最好通过生成临表再进行筛选减少运算次数

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/352756

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX