Cracking the coding interview--Q15.5

February 17, 2013
作者:Hawstein
出处:http://hawstein.com/posts/15.5.html
声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处。

题目

原文:

Imagine a simple database storing information for students’ grades. Design what this database might look like, and provide a SQL query to return a list of the honor roll students (top 10%), sorted by their grade point average.

译文:

有一个简单的数据库,存储学生的成绩信息。尝试设计这个数据库,它会是怎样的? 提供一个SQL查询语句来返回光荣榜学生信息(前10%),按照他们的GPA排序。

解答

在一个简单的数据库中,我们至少需要以下三张表:学生表(Students),课程表(Courses), 及课程登记表(CourseEnrollment)。学生表中至少需要有学生姓名和学生ID, 及其它的个人信息。课程表包含课程名和课程ID,还可以包含课程描述和授课老师等。 课程登记表将包含学生和课程对(即哪个学生选了什么课,某课程有哪些学生选), 还包含课程成绩等。我们假设课程成绩是一个整数。

获取光荣榜学生的SQL语句如下:

SELECT StudentName, GPA
FROM (
	SELECT 	top 10 percent Avg(CourseEnrollment.Grade) AS GPA,
	CourseEnrollment.StudentID
	FROM CourseEnrollment
	GROUP BY CourseEnrollment.StudentID
	ORDER BY Avg(CourseEnrollment.Grade)) Honors
INNER JOIN Students ON Honors.StudentID = Students.StudentID

全书题解目录:

Cracking the coding interview–问题与解答

全书的C++代码托管在Github上:

https://github.com/Hawstein/cracking-the-coding-interview