从重查询distictgroup和row_number() over

Posted weixin_ancenhw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从重查询distictgroup和row_number() over相关的知识,希望对你有一定的参考价值。

一. distinct

id name age height
10 xiaogang 23 181
11 xiaoli 31 176
12 xiaohei 22 152
13 xiaogang 26 172
14 xiaoming 31 176

查询语句:select distinct name from userinfo
(1)如结果:
name
xiaogang
xiaohei
xiaoli
xiaoming

如想得到id的值
select distinct name,id from userinfo
(2)结果如下:
name id
xiaogang 10
xiaoli 11
xiaohei 12
xiaogang 13
xiaoming 14

此时distinct同时作用了两个字段,即必须得id与name都相同的才会被排除

二. group by

select name from userinfo groub by name
运行sql的结果如上面distinct中的结果
name
xiaogang
xiaohei
xiaoli
xiaoming

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

三. row_number() over

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

以上是关于从重查询distictgroup和row_number() over的主要内容,如果未能解决你的问题,请参考以下文章

分页查询的两种方法(双top 双order 和 row_number() over ())

SQL分页查询,纯Top方式和row_number()解析函数的使用及区别

ROW_NUMBER 和 PARTITION 查询返回所有排名为 1 的行

查询性能:CTE 使用 ROW_NUMBER() 选择第一行

从 SQL SELECT 中的子查询和 ROW_NUMBER 窗口函数生成“平均”列

SQLSERVER分页查询关于使用Top方式和row_number()解析函数的不同