如何对 PostgreSQL 查询中的选择列应用 DISTINCT 约束?

假设您有一个包含 5 列的表exam_scores。下面给出了一个带有一些虚拟数据的示例。

名称roll_no主题总分获得分数
Anil1English10056
阿尼尔1Math10065
阿尼尔1Science10045
罗伊2English10078
罗伊2Math10098
罗伊2Science10067

现在,一名学生可以参加多个科目的考试,因此,一名学生有多个行。如果您想找出班级中的学生总数,您可能需要找到 roll_no 的不同值的数量。您可以对特定列应用不同的约束,如下所示 -

SELECT DISTINCT ON (roll_no) name, roll_no
FROM exam_scores
ORDER BY roll_no DESC

以下是上述查询的输出结果 -

名称roll_no
罗伊2
Anil1

您还可以对列别名应用不同的约束。

SELECT DISTINCT ON (student_id) name as student_name, roll_no as
student_id
FROM exam_scores
ORDER BY student_id ASC

上述查询的输出将如下所示 -

学生姓名学生卡
Anil1
Roy2

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主题总分获得分数
Roy2Science10067
罗伊2Math10098
罗伊2English10078
阿尼尔1Science10045
阿尼尔1Math10065
阿尼尔1English10056

请注意,ORDER BY 表达式与 DISTINCT ON 表达式具有相同的列顺序很重要。在覆盖 DISTINCT ON 列之后,ORDER BY 表达式可以有更多列。