如何在PostgreSQL查询中对选定列应用DISTINCT约束?
假设您有一个包含5列的exam_scores表。下面是一个带有示例数据的例子。
姓名(name) | 学号(roll_no) | 科目(subject) | 总分(total_marks) | 获得分数(marks_obtained) |
---|---|---|---|---|
Anil | 1 | 英语 | 100 | 56 |
Anil | 1 | 数学 | 100 | 65 |
Anil | 1 | 科学 | 100 | 45 |
Roy | 2 | 英语 | 100 | 78 |
Roy | 2 | 数学 | 100 | 98 |
Roy | 2 | 科学 | 100 | 67 |
现在,一个学生可以参加多门科目的考试,因此,一个学生有多行记录。如果您想找出班级的总人数,您可能需要查找roll_no的不同值的数量。您可以对特定列应用distinct约束,如下所示:
SELECT DISTINCT ON (roll_no) name, roll_no FROM exam_scores ORDER BY roll_no DESC
以下是上述查询的输出:
姓名(name) | 学号(roll_no) |
---|---|
Roy | 2 |
Anil | 1 |
您也可以对列别名应用distinct约束。
SELECT DISTINCT ON (student_id) name as student_name, roll_no as student_id FROM exam_scores ORDER BY student_id ASC
上述查询的输出如下所示:
学生姓名(student_name) | 学生ID(student_id) |
---|---|
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
此查询的输出如下所示:
姓名(name) | 学号(roll_no) | 科目(subject) | 总分(total_marks) | 获得分数(marks_obtained) |
---|---|---|---|---|
Roy | 2 | 科学 | 100 | 67 |
Roy | 2 | 数学 | 100 | 98 |
Roy | 2 | 英语 | 100 | 78 |
Anil | 1 | 科学 | 100 | 45 |
Anil | 1 | 数学 | 100 | 65 |
Anil | 1 | 英语 | 100 | 56 |
请注意,重要的是ORDER BY表达式与DISTINCT ON表达式具有相同的列顺序。ORDER BY表达式可以在DISTINCT ON列之后包含更多列。
广告