SQL Server 几种去重总结

sql 单表/多表查询去除重复记录
单表distinct
多表group by
group by 必须放在 order by 和 limit之前,不然会报错


1.Distinct:DISTINCT 用于返回唯一不同的值
distinct语法: select distinct 字段名称,字段名称 from 数据库名称

列子
CREATE TABLE userinfo
(
id INT PRIMARY KEY IDENTITY NOT NULL,
name NVARCHAR(50) NOT NULL,
age INT NOT NULL,
height INT NOT NULL
)
比如现在有一个用户表,插入条临时数据
如下:
INSERT INTO dbo.userinfo SELECT ‘xiaogang’,23,181 UNION ALL SELECT ‘xiaoli’,31,176 UNION ALL SELECT ‘xiaohei’,22,152 UNION ALL SELECT ‘xiaogang’,26,172 UNION ALL SELECT ‘xiaoming’,31,176

需求当前用户表不重复的用户名
select distinct name from userinfo

结果如下
name
xiaogang
xiaohei
xiaoli
xiaoming

可是我现在又想得到Id的值,改动如下
select distinct name,id from userinfo

结果如下

		xiaogang 10
		xiaoli 11
		xiaohei 12
		xiaogang 13
		xiaoming 14

distinct怎么没起作用?作用是起了的,不过他同时作用了两个字段,也就是必须得id与name都相同的才会被排除,关键字 distinct 只能放在 SQL 语句中所有字段的最前面才能起作用,如果放错位置,SQL 不会报错,但也不会起到任何效果

2 Row_Number() over
SQL Server 通过Row_Number 函数给数据库表的记录进行标号,在使用的时候后面会跟over 子句,而over 子句主要用来对表中的记录进行分组和排序的。

语法如下:ROW_NUMBER() OVER(PARTITION BY COLUMN1 ORDER BY COLUMN2)

1:Partition BY 用来分组

2:Order by 用来排序

接下来用 row_number()over 进行去重。首先用name 进行分组,id进行排序。

具体SQL 语句如下
SELECT * FROM (
select *,ROW_NUMBER() over(partition by name order by id desc) AS rn from userinfo ) AS u WHERE u.rn=1

结果如下
id name age height rn

	13 xiaogang 26 172 1
	12 xiaohei 22 152 1
	11 xiaoli 31 176 1
	14 xiaoming 31 176 1

通过使用 row_number over 子句就能将所有的列展示出来,同时进行去重。

3. group by
语句如下
a、select name from userinfo groub by name
运行上面sql的结果如
name
xiaogang
xiaohei
xiaoli
xiaoming

b、select name,id from userinfo groub by name ,id
运行上面sql的结果如
xiaogang 10
xiaoli 11
xiaohei 12
xiaogang 13
xiaoming 14

总结
distinct 和row_number over()区别:
(1)distinct 和 row_number over 都可以实现去重功能,而distinct 作用于当行的时候,其"去重" 是去掉表中字段所有重复的数据,作用于多行的时候是,其"去重"所有字段都相同的数据。
(2)在使用row_number over 子句时候是先分组,然后进行排序,再取出每组的第一条记录"去重"。

distinct 和group by 的区别:
(1)distinct常用来查询不重复记录的条数:count(distinct name),group by 常用它来返回不重记录的所有值。
(2)在使用group by 分组后,在select中可以选择分组字段,和非分组字段的函数值,如 max()、min()、sum、count()等

sql只根据某一字段去重,并保留其他字段
SQL只根据某一个字段去重并保留其他字段,要实现此需求的关键是用到两个函数,分别为:group by 与 max()
group by的目的是分组从而达到去重的效果,max()的目的是取分组重复的字段中取出随机的一条数据(比如说这里用的max()意思是取某一字段最大的,或者也可以用其他只能获取一条数据的函数,这里要根据具体的需求来决定)

SQL写法如下:
比如表user中有字段:id、name、age
id name age
1 张三 22
2 李四 23
3 王五 22
4 马六 24
5 徐七 23
我们想要查根据age去重的一个数据,并且name随机取一个id最大的即可,期望结果如下:
id name age
3 王五 22
4 马六 24
5 徐七 23
SQL为:
select id,name,age from user a where id in ( select max(id) as id from user b group by age )
或者用exists:
select id,name,age from user a where exists ( select id from ( select max(id) as id from user group by age ) b where a.id = b.id )

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在SQL Server中进行多字段去重操作时,通常需要使用DISTINCT关键字。DISTINCT关键字用于排除结果集中的重复行,例如: SELECT DISTINCT col1, col2 FROM table; 这将返回一个结果集,其中只包含不重复的col1和col2组合。 另一种方法是使用GROUP BY语句来对多个字段进行分组,然后使用聚合函数如COUNT、SUM或AVG来计算结果。例如: SELECT col1, col2, COUNT(*) FROM table GROUP BY col1, col2; 这将返回每个不重复的col1和col2组合以及它们在表中出现的次数。 如果需要基于多个列进行排序,可以使用ORDER BY子句。例如: SELECT DISTINCT col1, col2 FROM table ORDER BY col1, col2; 这将返回按col1和col2升序排序的结果。 ### 回答2: 在SQL Server中,去重操作可以通过使用DISTINCT关键字来实现。但是,如果要对多个字段进行去重,则需要采用不同的方法。 一种常见的方法是使用GROUP BY子句。在GROUP BY中,我们可以按照多个字段对数据进行分组,并且使用COUNT函数计算每个组中的行数。如果某个组具有超过1行,则说明该组中有重复的记录。因此,我们可以使用HAVING子句来筛选这些组,从而得到去重后的结果。 例如,假设我们有一个包含多个字段的表格,其中有些记录可能重复: ``` CREATE TABLE my_table ( id INT NOT NULL, name VARCHAR(50) NOT NULL, age INT NOT NULL, city VARCHAR(50) NOT NULL, PRIMARY KEY (id) ); INSERT INTO my_table VALUES (1, 'John', 25, 'New York'); INSERT INTO my_table VALUES (2, 'Mary', 30, 'Los Angeles'); INSERT INTO my_table VALUES (3, 'John', 25, 'New York'); INSERT INTO my_table VALUES (4, 'Bob', 35, 'Chicago'); INSERT INTO my_table VALUES (5, 'Mary', 30, 'Los Angeles'); ``` 现在,我们想要去掉其中的重复记录,即根据name、age和city字段去重。可以使用以下SQL查询: ``` SELECT name, age, city, COUNT(*) FROM my_table GROUP BY name, age, city HAVING COUNT(*) > 1 ``` 这将返回如下结果: ``` name | age | city | count ------+------+--------------+------- John | 25 | New York | 2 Mary | 30 | Los Angeles | 2 ``` 这意味着在这些组中有重复记录。因此,我们可以使用以下查询来获取去重后的结果: ``` SELECT DISTINCT name, age, city FROM my_table WHERE (name, age, city) NOT IN ( SELECT name, age, city FROM my_table GROUP BY name, age, city HAVING COUNT(*) > 1 ) ``` 这将返回以下结果: ``` name | age | city -----+-----+------------- Bob | 35 | Chicago John | 25 | New York Mary | 30 | Los Angeles ``` 这种方法的思路是找到具有重复记录的组,然后在结果中排除它们,从而得到去重后的结果。注意,此方法只能应用于小型表格,因为在大型表格中,GROUP BY和子查询会对性能产生不良影响。 因此,如果需要对大型表格进行去重操作,则最好使用其他方法,例如使用临时表或使用窗口函数等。 ### 回答3: 针对SQL Server字段去重问题,我们可以采用以下两种方式。 1. 使用DISTINCT关键字 在SELECT语句中使用DISTINCT关键字可以去除重复行。例如: ``` sql SELECT DISTINCT column1, column2, column3 FROM table_name ``` 该语句将从表中选择仅包含唯一组合的column1、column2和column3的行。需要注意的是,如果表中有多个重复组合,DISTINCT将只返回一行。 2. 使用GROUP BY和HAVING子句 使用GROUP BY子句按照指定的字段对结果进行分组,然后使用HAVING子句过滤掉不需要的结果。例如: ``` sql SELECT column1, column2, column3 FROM table_name GROUP BY column1, column2, column3 HAVING COUNT(*) > 1 ``` 该语句将从表中选择具有重复组合的行。GROUP BY将按照column1、column2和column3对结果进行分组。COUNT(*) > 1限制了只返回重复组合的行。 需要注意的是,在使用GROUP BY并计算聚合函数时,所有列都必须在GROUP BY中列出,否则会产生错误。如果不想在结果中包含所有分组列,则只需在SELECT语句中包含需要的列即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值