测试表:

使用Distinct:

+ 去除某列相同的数据,或者某几列都相同的数据。 + 根据单个字段去重,能精确去重; + 作用在多个字段时,只有当这几个字段的完全相同时,才能去重; + 关键字distinct只能放在SQL语句中的第一个,才会起作用
1
2
3
// 去除id,class,score都重复才去除
SELECT DISTINCT class, id,score
FROM drc_student;

1
2
SELECT DISTINCT class FROM drc_student;
// class列去重

2.使用groupby

![](https://cdn.nlark.com/yuque/0/2024/png/28066124/1718957696441-91a52702-edca-48ad-a3e3-3316f7460dcd.png)
  • 使用groupby()会直接对括号里面的列去重
  • 使用groupby的时候,select指定的字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中。也就是这里的select后面查询的列只能出现在group中,其他列作为聚合函数中的参数

3.使用窗口函数:

+ 窗口函数主要是用来根据某个字段去重,但是还有查询其他列
1
2
3
4
5
6
7
SELECT column1, column2, ...
FROM (
SELECT column1, column2, ...,
ROW_NUMBER() OVER (PARTITION BY column_to_deduplicate ORDER BY some_column) AS row_num
FROM table_name
) subquery
WHERE row_num = 1;

窗口函数:

:::info
ROW_NUMBER() OVER (PARTITION BY column_to_deduplicate ORDER BY some_column) AS row_num

:::

这里的PARTITION BY后面跟的是窗口, some_column表示窗口后的数据根据哪列排序

  • 窗口函数可以说是,先分组,后把同一组的数据中的其他列按照规则排序,最后生成多余的列
1
2
3
4
-- 窗口函数 :根据班级分组,班级内按照分数排序
SELECT id, class, score,
ROW_NUMBER() OVER (PARTITION BY class ORDER BY score) AS row_num
FROM drc_student;

1
2
3
4
5
6
7
8
9
10
--查询同班中不同的分数
SELECT id ,class,score
FROM
(
-- 窗口函数 :根据班级分组,班级内按照分数排序
SELECT id, class, score,
ROW_NUMBER() OVER (PARTITION BY class ORDER BY score) AS row_num
FROM drc_student
)subqury
WHERE row_num =1;