假设我有一张学生表,其中包含他们的 ID、年级和州:
-------------------------
| id | grade | state |
------------------------
| 1 | 83 | CA |
| 2 | 94 | TX |
| 3 | 92 | WA |
| 4 | 78 | CA |
我想要每个州的最高年级学生的 ID(例如 1、2 和 3),我该怎么做?
我知道如何找到最大值(可以做叉积(重命名为 R1 和 R2),然后为那些不是最高的人选择 R1.grade < R2.grade,然后从原始数据库中减去)。但我对如何为每个州做到这一点感到困惑。
我实际上对关系代数不是很满意,所以,我将首先使用标准 SQL 来完成,然后使用一个名为RelaX - 关系代数计算器 0.18.2的工具进行翻译。
首先,你写的表,我称它为学生,定义它并填入:
RelaX 会将其转换为数据集,由以下元组表示:
为了找到您要查找的内容,我们首先需要一个表格,其中包含表格中的元组
(state, grade)
,具有每个州的最高等级。此查询在 SQL 中完成,其中MAX(grade)
perstate
使用GROUPs BY state
. 你可以这样写:接下来,您需要将
JOIN
这张表(即命名为max_grades
)添加到students
一张,并且您将其设置为ON
相等的州和相等的等级(即:每个州的最高等级)......这被 RelaX 翻译成以下关系代数表达式和响应:
注1:
选择:
如果你不能
GROUP BY
,你可以使用另一个构造:这更符合您的原始想法,尽管我个人觉得不太清楚......
关系代数的翻译是:
编辑:我没有仔细阅读并给出了 SQL 的答案,以防张贴者感兴趣。如果您不感兴趣,请告诉我,然后我将删除。
SQL:我认为使用派生表是可行的。让我们称您的表为“学生”: