[转载]Rank() over()的用法

本文通过创建测试表并插入数据的方式,详细介绍了SQL中排名函数的应用方法。包括整体结果集的排名,以及通过PARTITION BY进行分组后的排名操作。不仅展示了不同场景下排名的变化,还解释了PARTITION BY的作用。
创建一个test表,并插入6条数据。
CREATE TABLE test
(
	a INT,
	b INT,
	c CHAR
)
INSERT INTO test VALUES(1,3,'E')
INSERT INTO test VALUES(2,4,'A')
INSERT INTO test VALUES(3,2,'D')
INSERT INTO test VALUES(3,5,'B')
INSERT INTO test VALUES(4,2,'C')
INSERT INTO test VALUES(2,4,'B')

 

 

SELECT * from test

 

 

a b c
----------- ----------- ----
1 3 E
2 4 A
3 2 D
3 5 B
4 2 C
2 4 B

(6 行受影响)

1、整个结果集是一个分组,以a进行排名

SELECT a,b,c,rank () OVER (ORDER BY a) rank FROM test

 

 

a b c rank
----------- ----------- ---- --------------------
1 3 E 1
2 4 A 2
2 4 B 2
3 2 D 4
3 5 B 4
4 2 C 6

(6 行受影响)

2、整个结果集是一个分组,以b进行排名

SELECT a,b,c,rank () OVER (ORDER BY b) rank FROM test

 

 

a b c rank
----------- ----------- ---- --------------------
3 2 D 1
4 2 C 1
1 3 E 3
2 4 A 4
2 4 B 4
3 5 B 6

(6 行受影响)

3、以a,b进行分组,在每个组内以b进行排名。分了5个组,第2行跟第3行是一个组,其他的每行是一个组。在第2行与第3行的组内以b排名,并列为1

SELECT a,b,c,rank () OVER (PARTITION BY a,b ORDER BY b) rank FROM test

 

a b c rank
----------- ----------- ---- --------------------
1 3 E 1
2 4 A 1
2 4 B 1
3 2 D 1
3 5 B 1
4 2 C 1

(6 行受影响)

4、以a,b进行分组,在每个组内以c进行排名。分了5个组,第2行跟第3行是一个组,其他的每行是一个组。在第2行与第3行的组内以c排名,由于c列一个是A,一个是B,所以Rank分别为1、2。

SELECT a,b,c,rank () OVER (PARTITION BY a,b ORDER BY c) rank FROM test

 

 

a b c rank
----------- ----------- ---- --------------------
1 3 E 1
2 4 A 1
2 4 B 2
3 2 D 1
3 5 B 1
4 2 C 1

(6 行受影响)

总结:1、partition by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组

SQL 中的 `RANK() OVER` 函数是一种分析函数,用于在数据集中对行进行排名。它通常用于按特定列的值排序并分配排名,特别是在存在重复值的情况下,`RANK()` 会为这些重复值分配相同的排名,并在后续排名中跳过相应的数字。例如,在成绩排名中,如果两名学生的成绩相同,则它们会被分配相同的排名,而下一名学生的排名会跳过一个数字。 `RANK() OVER` 的基本语法如下: ```sql RANK() OVER ( [PARTITION BY partition_expression, ... ] ORDER BY sort_expression [ASC | DESC], ... ) ``` - `PARTITION BY` 子句是可选的,用于将数据集分割成多个分区,在每个分区内独立计算排名。 - `ORDER BY` 子句用于指定在每个分区内行的排序方式。 例如,假设有一个雇员表 `employer`,其中包含部门 `deptid` 和薪水 `salary` 字段,我们想要为每个部门的雇员按薪水从高到低进行排名: ```sql SELECT *, RANK() OVER (PARTITION BY deptid ORDER BY salary DESC) AS Leve FROM employer; ``` 此查询会根据每个部门 (`PARTITION BY deptid`) 内的薪水 (`ORDER BY salary DESC`) 对雇员进行排名,排名结果将显示在 `Leve` 列中[^2]。 与 `RANK() OVER` 类似的还有 `DENSE_RANK() OVER` 和 `ROW_NUMBER() OVER`,它们之间的主要区别在于处理并列排名的方式不同。`DENSE_RANK()` 提供连续的排名,即使有多个相同的值,也不会跳过任何排名数字;而 `ROW_NUMBER()` 总是分配唯一的连续编号,即使有相同的值[^1]。 ### 示例 假设有一个名为 `testdata` 的表,包含字段 `id`, `ename`, `sal`, `code`,我们可以通过以下 SQL 查询来展示 `RANK()`, `DENSE_RANK()`, 和 `ROW_NUMBER()` 的不同效果: ```sql SELECT id, ename, sal, code, ROWNUM, ROW_NUMBER() OVER (PARTITION BY ename ORDER BY sal) row_number, RANK() OVER (PARTITION BY ename ORDER BY sal) rank_over, DENSE_RANK() OVER (PARTITION BY ename ORDER BY sal) dense_rank FROM testdata; ``` 在这个例子中,`PARTITION BY ename` 表示按照 `ename` 字段的值进行分组,每组内的记录再根据 `sal` 字段的值进行排序。这样可以针对每个 `ename` 组内的记录计算出不同的排名[^3]。 ### 总结 - `RANK() OVER` 函数适用于需要对数据集内的行进行排名的情况,尤其是在需要处理并列排名时。 - 使用 `PARTITION BY` 可以实现更细粒度的数据分析。 - 选择合适的排名函数(`RANK()`, `DENSE_RANK()`, 或 `ROW_NUMBER()`)取决于具体的业务需求和如何处理并列的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值