【发布时间】:2010-06-23 14:58:03
【问题描述】:
我有一个看起来像这样的表:
CREATE TABLE student_results(id integer, name varchar(32), score float);
让我们做以下两个假设:
- 假设分数从 0 到最大 100。
- 假设我想以 10 的“步长”为学生评分
所以我想应用以下评分:
Score Grade Awarded
0-10 GRADE9
10-20 GRADE8
20-30 GRADE7
30-40 GRADE6
40-50 GRADE5
50-60 GRADE4
60-70 GRADE3
70-80 GRADE2
80-90 GRADE1
99-100 GENIUS
我想编写一个接受以下输入参数的 SQL 查询:
lowest score: 0 in this example
highest score: 100 in this example
'step' size: 10 in this example
和以往一样,如果可能的话,我想使用 ANSI SQL 编写这样的查询。如果我必须选择一个数据库,那么按照偏好递减的顺序,它必须是:
- PostgreSQL
- MySQL
能否以上表为例,解释一下我如何能够编写一个执行这种评分的 SQL 查询?
[编辑]
Sample input data
1, 'homer', 10.5
2. 'santas little helper', 15.2
3, 'bart', 20.5
4, 'marge', 40.5
5. 'lisa', 100
我将有一个 SQL 函数grade_rank() - 对学生进行排名:
函数grade_rank()的参数是:
1st argument: LOWEST possible score value
2nd argument: HIGHEST possible score value
3rd argument: step size, which determines the levels/divisions between the ranks
select id, name, grade_rank(0,100, 10) grade from student_scores;
输出(基于上面的输入)应该是:
1, homer, GRADE9
2. santas liitle helper GRADE9
3, bart, GRADE8
4, marge, GRADE6
5. lisa, GENIUS
【问题讨论】:
-
您能否发布一个此类查询的预期输出示例?
-
您是否在问如何使用
BETWEEN而不是=进行连接? -
您的原始评分列表仅处理整数,但您在编辑部分中的示例数据是指介于原始边界之间的实数。例如。 10.5 介于 GRADE9 和 GRADE8 之间。您应该编辑一个或另一个,以准确显示您希望它如何工作。我认为到目前为止提供的答案仅适用于整数值。
-
让步数从 0-10、10-20 开始不是更有意义,这样您的所有步数都相等吗?现在你的第一步实际上是大小 11,你的最后一步是 9。
-
@ivar + mike:点了。我只是试图展示一般概念,而忽略了成绩之间存在差距的事实。我将编辑数据,使成绩之间没有差距。顺便说一句,分数是实数(不是整数)
标签: sql mysql postgresql