sql server 根据字段去重

使用 row_number() over (partition by 要去重的字段 order by 排序字段)

 

 

数据库表结构 学生成绩表 UserGrade

Id        int              Checked     主键Id
Name   varchar(50) Checked     学生名
Course varchar(50) Checked     课程名
Score   int             Checked      分数

 

有如下数据,

 

1001 李四 英语 100 

1000 张三 语文 80

 1004 李四 数学 60

 1005 李四 语文 80 

1008 张三 英语 60

 1007 王五 数学 30

 1006 王五 语文 50 

1003 王五 英语 50 

1002 张三 数学 90 

 



要获取学生名并去重
select
name fromselect name ,row_number() over ( partition by name order by score) rn from UserGradeas s
where rn=1

 

其实就是根据名称进行分组取每组中的第一个

select name ,row_number() over ( partition by name order by score) rn from UserGrade

查询结果为
李四1
李四  2
 李四  3
 王五  1
 王五  2
 王五  3
 张三  1
 张三  2
 张三  3

 

 

转载于:https://www.cnblogs.com/zhangmm96/p/11133661.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值