SQL跨组去重
时间: 2025-05-07 22:44:08 浏览: 21
### SQL 跨组去重方法
在处理复杂的数据集时,有时需要执行跨多个列或字段的组合去重操作。这可以通过多种方式实现。
#### 方法一:使用 `DISTINCT` 关键字
当目标是从多列中获取唯一组合时,可以简单地应用 `DISTINCT` 来消除重复条目。例如:
```sql
SELECT DISTINCT col1, col2 FROM table_name;
```
这种方法适用于想要获得两列或多列的不同组合的情况[^2]。
#### 方法二:利用窗口函数配合子查询
对于更复杂的场景,比如基于某些特定条件下的跨组去重,则可采用窗口函数如 `ROW_NUMBER()` 或者其他分析函数来进行更为精细的操作。下面是一个例子展示如何通过这种方式达到目的:
```sql
WITH RankedData AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY some_column) as rn
FROM table_name
)
SELECT *
FROM RankedData
WHERE rn = 1;
```
这里创建了一个名为 `RankedData` 的临时视图,在其中给每一组分配了唯一的行号 (`rn`);最后只选取每组的第一行作为代表,实现了跨组别的去重效果[^1]。
#### 方法三:运用集合运算符 `UNION`
如果存在两个独立的结果集并且希望从中提取不重复的部分,那么可以直接使用 `UNION` 操作符连接它们。需要注意的是,默认情况下 `UNION` 已经包含了隐式的 `DISTINCT` 功能,因此无需额外指定。
```sql
(SELECT col1, col2 FROM table_a)
UNION
(SELECT col1, col2 FROM table_b);
```
上述语句将会把来自两张不同表格中的相同记录视为单一实例而仅保留一份副本。
### 示例说明
假设有一个包含学生信息的学生表 `students` 和课程注册表 `registrations`,现在想找出每位同学所选修过的独一无二科目列表而不考虑其所在班级或其他因素的影响。此时就可以采取上面提到的技术之一来完成任务。
```sql
-- 使用 DISTINCT 对 student_id 和 subject_code 组合进行去重
SELECT DISTINCT s.student_id, r.subject_code
FROM students s JOIN registrations r ON s.id = r.student_id;
-- 或者借助窗口函数实现更加灵活的选择逻辑
WITH UniqueSubjectsPerStudent AS (
SELECT s.student_id,
r.subject_code,
ROW_NUMBER() OVER(PARTITION BY s.student_id, r.subject_code ORDER BY r.enrollment_date DESC) AS row_num
FROM students s JOIN registrations r ON s.id = r.student_id
)
SELECT usps.student_id, usps.subject_code
FROM UniqueSubjectsPerStudent usps
WHERE usps.row_num = 1;
```
这两段代码片段都达到了预期的效果——即为每个学生筛选出了他们曾经学习过的一系列无重复科目的清单。
阅读全文
相关推荐

















