假设您有一个包含 5 列的表exam_scores。下面给出了一个带有一些虚拟数据的示例。
名称 | roll_no | 主题 | 总分 | 获得分数 |
---|---|---|---|---|
Anil | 1 | English | 100 | 56 |
阿尼尔 | 1 | Math | 100 | 65 |
阿尼尔 | 1 | Science | 100 | 45 |
罗伊 | 2 | English | 100 | 78 |
罗伊 | 2 | Math | 100 | 98 |
罗伊 | 2 | Science | 100 | 67 |
现在,一名学生可以参加多个科目的考试,因此,一名学生有多个行。如果您想找出班级中的学生总数,您可能需要找到 roll_no 的不同值的数量。您可以对特定列应用不同的约束,如下所示 -
SELECT DISTINCT ON (roll_no) name, roll_no FROM exam_scores ORDER BY roll_no DESC
以下是上述查询的输出结果 -
名称 | roll_no |
---|---|
罗伊 | 2 |
Anil | 1 |
您还可以对列别名应用不同的约束。
SELECT DISTINCT ON (student_id) name as student_name, roll_no as student_id FROM exam_scores ORDER BY student_id ASC
上述查询的输出将如下所示 -
学生姓名 | 学生卡 |
---|---|
Anil | 1 |
Roy | 2 |
DISTINCT 约束也可以应用于多个列。假设您要查找收到的不同答卷的数量。这将等于 (roll_no, subject) 组合的不同值的数量。
SELECT DISTINCT ON (roll_no, subject) name, roll_no, subject FROM exam_scores ORDER BY roll_no, subject, name DESC
此查询的输出如下 -
名称 | roll_no | 主题 | 总分 | 获得分数 |
---|---|---|---|---|
Roy | 2 | Science | 100 | 67 |
罗伊 | 2 | Math | 100 | 98 |
罗伊 | 2 | English | 100 | 78 |
阿尼尔 | 1 | Science | 100 | 45 |
阿尼尔 | 1 | Math | 100 | 65 |
阿尼尔 | 1 | English | 100 | 56 |
请注意,ORDER BY 表达式与 DISTINCT ON 表达式具有相同的列顺序很重要。在覆盖 DISTINCT ON 列之后,ORDER BY 表达式可以有更多列。