`

排名函数(ROW_NUMBER、RANK、DENSE_RANK)及OVER子句

 
阅读更多
--在部门内新水排名(如果有相同名次,用dense_rank)
SELECT row_number() over
(PARTITION BY t.deptno  --按部门分组
ORDER BY t.sal) rn, --部门内按薪水排序
 t.sal, t.ename, t.deptno 
  FROM emp t;
--分组累计计数,注意相同sal情况
SELECT COUNT(*) over(PARTITION BY t.deptno ORDER BY sal) cn, t.sal, t.ename, t.deptno 
FROM emp t;


一、排名函数
1>、计算行号ROW_NUMBER函数
2>、排名和密集排号RANK和DESN_RANK

--示例:
CREATE TABLE dbo.Sales
(
  empid VARCHAR(10) NOT NULL PRIMARY KEY,
  mgrid VARCHAR(10) NOT NULL,
  qty   INT         NOT NULL
);

INSERT INTO dbo.Sales(empid, mgrid, qty) VALUES
  ('A', 'Z', 300),
  ('B', 'X', 100),
  ('C', 'X', 200),
  ('D', 'Y', 200),
  ('E', 'Z', 250),
  ('F', 'Z', 300),
  ('G', 'X', 100),
  ('H', 'Y', 150),
  ('I', 'X', 250),
  ('J', 'Z', 100),
  ('K', 'Y', 200);

CREATE INDEX idx_qty_empid ON dbo.Sales(qty, empid);
CREATE INDEX idx_mgrid_qty_empid ON dbo.Sales(mgrid, qty, empid);
GO

select ROW_NUMBER() OVER (ORDER BY qty) AS seq,
RANK()OVER (ORDER BY qty) AS seq1,
 DENSE_RANK() OVER (ORDER BY qty) AS seq2,
 *
FROM Sales s			
--运行结果

seq	seq1	seq2	empid	mgrid	qty
1	1	1	B	X	100
2	1	1	G	X	100
3	1	1	J	Z	100
4	4	2	H	Y	150
5	5	3	C	X	200
6	5	3	D	Y	200
7	5	3	K	Y	200
8	8	4	E	Z	250
9	8	4	I	X	250
10	10	5	A	Z	300
11	10	5	F	Z	300


区别:当order by 列表不能唯一决定排序顺序时,ROW_NUMBER是非确定性的。而RANK和DENSE_RANK总是确定性的。即,具有相同排序值的行总是得到相同的排名值。而RANK和DENSE_RANK的区别在于,RANK生成的排名值可能有间断,但可以表明有多少行具有更低的排序值。DENSE_RANK生成的排名值没有间断。



--分析函数:
count(a) over (partition by b order by c)
--上面的count()就是一个分析函数;over可以理解为一个关键字或者标识,有over就表示它前面的函数
--是一个分析函数,否则就是普通的求和函数了;
--()中的partition by是指定分区,或者理解为分组
--()中的order by是指定该分区内的数据的顺序


分享到:
评论

相关推荐

    分析函数ROW_NUMBER、RANK、DENSE_RANK的用法

    ### 分析函数ROW_NUMBER、RANK、DENSE_RANK的用法 #### 一、ROW_NUMBER()函数 **ROW_NUMBER()** 函数是SQL Server 2005引入的一个新的窗口函数,它为每一行返回一个唯一的整数值。该函数特别适用于需要对查询结果...

    Oracle开发之分析函数(Rank, Dense_rank, row_number)

    Oracle分析函数Rank、Dense_rank和row_number是用于处理数据集的高级工具,它们在数据库查询中发挥着关键作用,特别是在需要对数据进行排序和分组时。这三种函数都有各自的特点,适用于不同的业务场景。 1. **row_...

    oracle row_number用法

    `ROW_NUMBER()`可以与`RANK()`和`DENSE_RANK()`进行比较。这些函数都可以用来给数据排序并分配等级,但是它们在处理并列的情况时有所不同: - **Rank**:如果两个或多个行具有相同的排序值,则这些行都将获得相同...

    [sql server]SQL Server2005杂谈(3):四个排名函数的比较.doc

    SQL Server 2005 中提供了四个排名函数,分别是 row_number、rank、dense_rank 和 ntile。这四个函数的主要功能是为查询结果生成一个序号,用于实现查询指定范围的记录或实现分页功能。 一、row_number 函数 row_...

    深入探讨:oracle中row_number() over()分析函数用法

    Oracle数据库中的`row_number() over()`分析函数是一个非常实用的工具,用于为数据集中的每一行分配一个唯一的整数,这个数字基于指定的排序条件。在处理大数据集时,它可以帮助我们进行分页、排名或者在复杂的查询...

    SQL Server 2005中ROW_NUMBER()函数在存储过程分页中的应用.pdf

    此外,`ROW_NUMBER()`函数还有其他窗口函数,如`RANK()`和`DENSE_RANK()`,它们在某些场景下可能会提供更灵活的解决方案。但在这里,我们主要关注`ROW_NUMBER()`在分页中的应用。 总结起来,`ROW_NUMBER()`函数在...

    SQLSERVER 2005的ROW_NUMBER、RANK、DENSE_RANK的用法

    在SQL Server 2005中,ROW_NUMBER()、RANK()和DENSE_RANK()是三个重要的排名函数,它们在数据分析和查询优化方面扮演着重要角色。这些函数可以帮助用户更方便地处理排序和分组数据,尤其在处理大量数据时。 1. ROW_...

    ROW_NUMBER(),RANK()和DENSE_RANK()之间的区别

    ROW_NUMBER()、RANK()和DENSE_RANK()是其中的三个关键函数,它们都用于对数据进行排序并分配唯一的序列号,但各有其特点和适用场景。以下是对这三个函数的详细解释: 1. ROW_NUMBER() ROW_NUMBER()函数为每一行提供...

    SQL server中row_number(),rank(),dense_rank()排序

    总结来说,`row_number()`提供了唯一的序列号,`rank()`和`dense_rank()`则用于处理排名,其中`rank()`可能会产生空缺的排名,而`dense_rank()`则确保排名连续。这三个函数在处理复杂的数据分析任务时,能提供非常...

    hive分析函数

    本文将介绍 Hive 中的四个序列函数:NTILE、ROW_NUMBER、RANK 和 DENSE_RANK。 首先,让我们了解什么是序列函数。序列函数是 Hive 中的一种特殊函数,用于对数据进行排序和编号。序列函数可以将数据分组并对每组...

    oracle_排列rank()函数

    在Oracle数据库中,`RANK()`函数是一种窗口函数,它被用于在一组数据中为每一行分配一个唯一的排名。此函数特别适用于需要基于特定条件对数据进行排序并为每个记录分配一个名次的情况。在本篇文章中,我们将深入探讨...

    利用ROW_NUMBER() OVER函数给SQL数据库中每一条记录分配行号的方法

    除了基本的行号分配,ROW_NUMBER() OVER还可以与其他窗口函数如RANK()和DENSE_RANK()结合使用,以实现更复杂的排名需求。例如,RANK()会跳过相同的行号,而DENSE_RANK()则不会。这些函数对于数据分析、报表生成以及...

    over函数的使用

    `over`函数通常与`row_number()`、`rank()`、`dense_rank()`等函数配合使用,以实现对数据的复杂排序和分组需求。 ### `over(partition by)` 函数详解 `over(partition by)`用于将数据集划分为不同的分区或子集,...

    oracle分析函数

    - **rank()** 和 **dense_rank()**:与 `row_number()` 类似,但当遇到相同排序值时,`rank()` 会跳过一些行号,而 `dense_rank()` 不会。 #### 拓展应用 - **数据排名**:可以使用 `row_number()` 来确定数据集中...

    oracle分析函数over_及开窗函数.txt

    本文将详细介绍Oracle中的`OVER`子句以及几种常用的开窗函数,包括`ROW_NUMBER()`, `RANK()`, `DENSE_RANK()`和`LAG()`等。 #### 二、基本概念 - **`OVER`子句**:`OVER`子句用于指定分析函数的作用范围,它可以...

    Sql Server2005对t-sql的增强之排名函数

    排名函数主要包括ROW_NUMBER、RANK、DENSE_RANK以及NTILE,它们各自有着不同的应用场景和功能。 1. NTILE函数 NTILE函数用于将一个有序分区的行分配到指定数量的组中。每个组都有一个从1开始的编号。例如,如果...

    SQL-生成序号的四种方式1

    SQL Server 2005引入了四个排名函数,分别是`row_number`, `rank`, `dense_rank`, 和 `ntile`。这些函数帮助我们为查询结果集中的每一行赋予一个唯一的或基于特定条件的顺序编号。 1. `row_number()` `row_number...

    Oracle分析函数

    ROW WINDOW 函数用于指定一个行窗口,例如 ROWS N PRECEDING,表示当前行及之前 N 行的所有数据。 三、聚合函数 Oracle 分析函数中提供了多种聚合函数,包括: 3.1 AVG 函数 AVG 函数用于计算表达式的平均值。 ...

Global site tag (gtag.js) - Google Analytics