如何在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列之後包含更多列。
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP