252

在现代数据驱动的应用程序中,这对于有效查询和排序数据至关重要。 SQL语言提供了实现此目标的各种强大工具,并且()函数是非常有用的工具。它可以按分组对数据进行排序,并为每行分配一个唯一的行号。当处理复杂的数据集时,例如在页面上显示数据时或需要在组中进行排序时,这一点特别有用。本文将详细介绍如何使用()函数将(在数据库中进行分组和排序),并演示如何通过特定示例使用它。

1。序言

‌()over(按顺序)是一个可以在Hive和.0或更高版本中使用的SQL窗口函数。它用于对每个分区中的每一行排序和编号,从1开始编号,并给出连续数字。它通常用于分析和报告等方案,可以帮助我们在分区后对数据进行分类并获得排名信息。

()该函数可以按功能完成以下功能和顺序。

应用程序方案:例如,在学校考试结束后,按学科组成,每个主题都按分数排序以获得前十名。

摘要:这是一个分组排序函数,可以首先将查询结果集分组,然后在每个组中对其进行排序。从1开始,将每个组中的一行分配给连续的唯一数字。

2。()语法

注意:以下两种写作方法是分组分类函数,语法所获得的效果相同。

编写的第一种方法:()通过(通过将列订单分组为ASC/DESC)为别名

写作的第二种方式:()over(通过将列排序分类为ASC/desc)为别名

简而言之,在执行该函数时,首先根据by的列进行分组。将组分开后,根据顺序列将其排序。

功能:

注意:

问题

问:该功能为每个组中的每一行分配了唯一的连续编程。也就是说,组中的每一行数据编号只会从1分配,并且不会重复。如果我们对考试成绩进行排序,并希望具有相同分数的人会排名相同,该怎么办?

答:此时,您需要使用rank()函数或()函数。这两个函数将相同的排名分配给相同的值。

3。用法示例

根据.0执行以下示例

准备数据

create table test(
       id varchar(10) NOT NULL,
       `name` varchar(10) NULL,
       age varchar(10) NULL,
       salary int NULL
);
-- 数据是每个人不同年龄段的薪资数据
insert into test(id,`name`,age,salary) values(101,'张三',24,15000);
insert into test(id,`name`,age,salary) values(101,'张三',22,8000);
insert into test(id,`name`,age,salary) values(101,'张三',20,6500);
insert into test(id,`name`,age,salary) values(102,'李四',23,18000);
insert into test(id,`name`,age,salary) values(102,'李四',22,8500);
insert into test(id,`name`,age,salary) values(102,'李四',21,7500);
insert into test(id,`name`,age,salary) values(103,'王五',24,25000);
insert into test(id,`name`,age,salary) values(103,'王五',22,18000);
insert into test(id,`name`,age,salary) values(103,'王五',20,12000);
select * from test;

表数据:

3.1。对查询进行排序结果相反顺序(无分组)

SELECT id,`name`,age,salary,ROW_NUMBER() OVER(ORDER BY salary DESC) rn
FROM test;

注意:如果您不指定组,则将对全局进行排序,将所有数据视为组;然后,每行将在每个组中的1个连续编号。如上图所示,RN从1到9开始。

3.2。小组查询结果并对其进行排序

SELECT id,`name`,age,salary,ROW_NUMBER() OVER(PARTITION BY name ORDER BY salary DESC) RN
FROM test;

注意:首先按名称执行,然后通过排序在组中进行排序。

如上图所示:RN将为每个组中的每一行数据分配一个唯一的连续数字。

3.3。检查每个ID的最高工资

也就是说,在分组后按工资分类,并在每组中找到最高工资(分类为1)的记录

SELECT *
FROM (SELECT id,`name`,age,salary,ROW_NUMBER() OVER(PARTITION BY id ORDER BY salary DESC) RN
FROM test) a
WHERE a.RN = 1 ;

找出每个ID的最高工资,即每个ID组的排名

从一个示例中学习:我们还可以使用上述示例,例如,我们可以在比赛中每个组中获得前十名。也就是说,首先,然后对分数进行排序并获得RN