sql去重复统计成绩-sql 去重统计成绩
3人看过
告别重复统计:以 SQL 去重统计成绩的高效方案

在数据仓库构建、报表分析及 BI 可视化场景中,获取“唯一成绩统计”是基础且高频的查询需求。不过,在实际操作中,由于数据源存在脏数据、冗余记录或并发操作,若直接使用 `COUNT()` 统计,会得到包含重复项的不准确结果。这篇文章将深入探讨如何利用 SQL 逻辑去重,并凭借实战案例和数据说明,提供一套高效、低成本的解决方案。
问题背景与核心痛点
假设我们有一个名为 `student_scores` 的表,其中记录了多学生的考试分数。如果直接统计:
```sql
SELECT COUNT() FROM student_scores;
```
结果将显示为 `100`,系统认为有 100 名学生 参加了考试。
不过,实际情况是:- 只有 50 名学生实际参加考试;
- 其中 5 名学生的成绩被录入了两遍(是录入错误或重复提交);
- 或者数据表中存在 `id` 相同的重复记录。
此时,若用于考核或资源分配,直接统计 100 人会导致资源浪费或决策失误。
去重统计策略
在 SQL 中实现“去重统计”关键有两种场景:
1. 统计唯一数据条数:即统计有多少条不同的记录。
2. 统计唯一值个数:即统计某个字段(如成绩)有多少种不同的数值。
场景 A:统计唯一记录数(去重)
利用 `DISTINCT` 关键字能够去除所有重复的行:
```sql
SELECT COUNT(DISTINCT student_id) AS unique_students
FROM student_scores;
```
说明:`DISTINCT` 用于去除行中的重复值,返回的是不同值的数量。
场景 B:统计唯一成绩数(去重)
假如目的是统计“成绩”这一字段的去重值:

```sql
SELECT COUNT(DISTINCT score) AS unique_scores
FROM student_scores;
```
实战数据说明与验证
为了更直观地展示去重统计,我们构建一个模拟数据集开展对比分析。
原始数据(包含重复)
| student_id | score | |
|---|---|---|
| 1001 | 95 | |
| 1002 | 88 | |
| 1001 | 95 | ← 重复记录 |
| 1003 | 76 | |
| 1002 | 88 | ← 重复记录 |
| 1004 | 65 | |
| 1001 | 95 | ← 重复 |
| 1005 | 90 | |
| 1003 | 76 | ← 重复 |
| 1003 | 76 | ← 重复 |
| 1005 | 90 | ← 重复 |
- 总行数:11
- 学生人数:5 人
- 成绩个数:3 个(65, 76, 88, 90, 95)
去重后统计结果
若执行去重查询,结果将变为:
| 字段 | 值 |
|---|---|
| unique_students | 5 |
| unique_scores | 5 |
- 唯一学生数:5 人
- 唯一成绩数:5 个(65, 76, 88, 90, 95)
结论:通过 `COUNT(DISTINCT ...)` 消除了重复干扰,获取了准确的数据视图。
性能优化建议
在大规模数据量(如百万级)下,若执行 `SELECT` 后紧跟 `COUNT()` 带来轻微的性能开销,因为数据库需扫描全表。若频繁执行此类查询,可考虑优化以下策略:
- 创建唯一索引:在 `student_id` 或 `score` 字段上建立唯一索引,避免重复数据。
- 使用窗口函数替代:部分数据库(如 PostgreSQL)支持 `COUNT() OVER (PARTITION BY ...)`,可在不修改表结构下高效处理分组统计。
总结
在数据治理与报表开发中,“去重” 是确保数据准确性的基石。通过掌握 `COUNT(DISTINCT ...)` 的使用场景,并结合索引优化与窗口函数等高级技巧,我们不仅能解决简单的重复计数问题,还能构建出更健壮、可信赖的数据分析体系。
记住:在数据的世界里,重复意味着“脏”,而 `DISTINCT` 则是清洗数据的利器。
52 人看过
21 人看过
20 人看过


