`

排名或顺序的函数 ROW_NUMBER/RANK/DENSE_RANK/NTILE

 
阅读更多

排名或顺序的函数 ROW_NUMBER/RANK/DENSE_RANK/NTILE

测试表/数据
CREATE TABLE test_course (
  student_name  VARCHAR(10),  -- 学生
  course_name   VARCHAR(10),  -- 课程
  grade         INT           -- 成绩
);


INSERT INTO test_course VALUES('甲', '语文', 95);
INSERT INTO test_course VALUES('乙', '语文', 85);
INSERT INTO test_course VALUES('丙', '语文', 75);
INSERT INTO test_course VALUES('丁', '语文', 65);
INSERT INTO test_course VALUES('戊', '语文', 55);
INSERT INTO test_course VALUES('己', '语文', 50);
INSERT INTO test_course VALUES('庚', '语文', 60);
INSERT INTO test_course VALUES('辛', '语文', 70);
INSERT INTO test_course VALUES('壬', '语文', 80);
INSERT INTO test_course VALUES('奎', '语文', 90);

INSERT INTO test_course VALUES('甲', '数学', 90);
INSERT INTO test_course VALUES('乙', '数学', 80);
INSERT INTO test_course VALUES('丙', '数学', 70);
INSERT INTO test_course VALUES('丁', '数学', 60);
INSERT INTO test_course VALUES('戊', '数学', 50);
INSERT INTO test_course VALUES('己', '数学', 50);
INSERT INTO test_course VALUES('庚', '数学', 60);
INSERT INTO test_course VALUES('辛', '数学', 70);
INSERT INTO test_course VALUES('壬', '数学', 85);
INSERT INTO test_course VALUES('奎', '数学', 95);

 

ROW_NUMBER 顺序编号

按照分数 编号 从高到底
SELECT
  ROW_NUMBER() OVER( ORDER BY SUM(grade) DESC) AS NO,
  student_name,
  SUM(grade) AS AllGrade
FROM
  test_course
GROUP BY
  student_name
ORDER BY
  SUM(grade) DESC

1 甲 185
2 奎 185
3 壬 165
4 乙 165
5 丙 145
6 辛 140
7 丁 125
8 庚 120
9 戊 105
10 己 100


按照分数 编号 从高到底(区分 课程)

SELECT
  ROW_NUMBER() OVER(PARTITION BY course_name ORDER BY grade DESC) AS NO,
  *
FROM
  test_course
ORDER BY
  course_name,
  grade DESC

1 奎 数学 95
2 甲 数学 90
3 壬 数学 85
4 乙 数学 80
5 丙 数学 70
6 辛 数学 70
7 庚 数学 60
8 丁 数学 60
9 戊 数学 50
10 己 数学 50
1 甲 语文 95
2 奎 语文 90
3 乙 语文 85
4 壬 语文 80
5 丙 语文 75
6 辛 语文 70
7 丁 语文 65
8 庚 语文 60
9 戊 语文 55
10 己 语文 50

 

RANK 排名不连续

按照分数 排名 从高到底
SELECT
  RANK() OVER( ORDER BY SUM(grade) DESC) AS NO,
  student_name,
  SUM(grade) AS AllGrade
FROM
  test_course
GROUP BY
  student_name
ORDER BY
  SUM(grade) DESC

1 甲 185
1 奎 185
3 壬 165
3 乙 165
5 丙 145
6 辛 140
7 丁 125
8 庚 120
9 戊 105
10 己 100

按照分数 排名 从高到底(区分 课程)

SELECT
  RANK() OVER(PARTITION BY course_name ORDER BY grade DESC) AS NO,
  *
FROM
  test_course
ORDER BY
  course_name,
  grade DESC

1 奎 数学 95
2 甲 数学 90
3 壬 数学 85
4 乙 数学 80
5 丙 数学 70
5 辛 数学 70
7 庚 数学 60
7 丁 数学 60
9 戊 数学 50
9 己 数学 50
1 甲 语文 95
2 奎 语文 90
3 乙 语文 85
4 壬 语文 80
5 丙 语文 75
6 辛 语文 70
7 丁 语文 65
8 庚 语文 60
9 戊 语文 55
10 己 语文 50

 

DENSE_RANK 排名连续

按照分数 排名 从高到底

SELECT
  DENSE_RANK() OVER( ORDER BY SUM(grade) DESC) AS NO,
  student_name,
  SUM(grade) AS AllGrade
FROM
  test_course
GROUP BY
  student_name
ORDER BY
  SUM(grade) DESC

1 甲 185
1 奎 185
2 壬 165
2 乙 165
3 丙 145
4 辛 140
5 丁 125
6 庚 120
7 戊 105
8 己 100

按照分数 排名 从高到底(区分 课程)
SELECT
  DENSE_RANK() OVER(PARTITION BY course_name ORDER BY grade DESC) AS NO,
  *
FROM
  test_course
ORDER BY
  course_name,
  grade DESC

1 奎 数学 95
2 甲 数学 90
3 壬 数学 85
4 乙 数学 80
5 丙 数学 70
5 辛 数学 70
6 庚 数学 60
6 丁 数学 60
7 戊 数学 50
7 己 数学 50
1 甲 语文 95
2 奎 语文 90
3 乙 语文 85
4 壬 语文 80
5 丙 语文 75
6 辛 语文 70
7 丁 语文 65
8 庚 语文 60
9 戊 语文 55
10 己 语文 50

 

NTILE 分组

按照分数 划分5个区间 从高到底
SELECT
  NTILE(5) OVER( ORDER BY SUM(grade) DESC) AS NO,
  student_name,
  SUM(grade) AS AllGrade
FROM
  test_course
GROUP BY
  student_name
ORDER BY
  SUM(grade) DESC

1 甲 185
1 奎 185
2 壬 165
2 乙 165
3 丙 145
3 辛 140
4 丁 125
4 庚 120
5 戊 105
5 己 100

按照分数 划分区间 从高到底(区分 课程)
SELECT
  NTILE(5) OVER(PARTITION BY course_name ORDER BY grade DESC) AS NO,
  *
FROM
  test_course
ORDER BY
  course_name,
  grade DESC

1 奎 数学 95
1 甲 数学 90
2 壬 数学 85
2 乙 数学 80
3 丙 数学 70
3 辛 数学 70
4 庚 数学 60
4 丁 数学 60
5 戊 数学 50
5 己 数学 50
1 甲 语文 95
1 奎 语文 90
2 乙 语文 85
2 壬 语文 80
3 丙 语文 75
3 辛 语文 70
4 丁 语文 65
4 庚 语文 60
5 戊 语文 55
5 己 语文 50

分享到:
评论

相关推荐

    SQL2005 四个排名函数(row_number、rank、dense_rank和ntile)的比较

    还是以上述为例,当field1字段值相同时,dense_rank函数会连续分配序号,即后三条记录的序号分别为1、1、1,而第4条记录的序号将是2,保持序号的连续性,后面的记录依然依次递增。SQL语句如下: ```sql select ...

    ROW_NUMBER、RANK、DENSE_RANK 和 NTILE

    ROW_NUMBER、RANK、DENSE_RANK 和 NTILE 排名函数 MS SQL 2005 中的排名函数包括 ROW_NUMBER、RANK、DENSE_RANK 和 NTILE,这四个函数可以有效地分析数据并提供排序值。下面将详细介绍每个函数的用法和示例。 一、...

    sql四大排名函数之ROW_NUMBER、RANK、DENSE_RANK、NTILE使用介绍

    总结来说,ROW_NUMBER()是按顺序分配唯一的序号,RANK()和DENSE_RANK()处理相同值时有不同的排名策略,RANK()会跳跃,DENSE_RANK()保持连续,而NTILE()则用于将数据分组到固定数量的分区。理解并熟练运用这些函数,...

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

    SQL Server 2005 排名函数比较 ...row_number 函数可以用于实现查询表中指定范围的记录或实现分页功能,rank 函数和 dense_rank 函数用于考虑排序字段值相同的情况,ntile 函数用于将查询结果分为多个组。

    SQL2005的排名函数以及透析函数(博客源码)

    博客文章地址:http://blog.csdn.net/pfe_nova/article/details/41357435 SQL2005之后添加的几个排名函数以及透析与反透析关键字,主要有Row_Number、RANK、DENSE_RANK、NTILE函数,pivot以及unpivot关键字

    hive分析函数

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

    ORACLE 常用分析函数

    分析函数2(Rank, Dense_rank, row_number);分析函数3(Top/Bottom N、First/Last、NTile);窗口函数;报表函数;分析函数总结;26个分析函数;PLSQL开发笔记和小结;分析函数简述  ROW_NUMBER () OVER([partition_clause]...

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

    ROW_NUMBER可以为每个行提供唯一的序列号,RANK和DENSE_RANK则在处理排名和并列时提供不同的策略,而NTILE则能实现动态分组,非常适合进行分段统计或分区处理。在SQL Server 2005之后的版本中,这些函数仍然被广泛...

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

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

    Oracle分析函数

    DENSE_RANK 函数用于计算行的相对排序,相同的值具有一样的序数。 3.8 FIRST_VALUE 函数 FIRST_VALUE 函数用于获取一个组的第一个值。 3.9 LAG 函数 LAG 函数用于访问之前的行。 3.10 LAST_VALUE 函数 LAST_...

    Oracle分析函数使用总结

    例如,你可以用ROW_NUMBER()和NTILE()来实现数据的分桶或分区,然后用RANK()或DENSE_RANK()来确定每个桶内的排名。CUME_DIST()和PERCENT_RANK()则有助于理解数据的分布特性,对于数据分析和报告非常有价值。 总的来...

    hive开窗函数.docx

    此外,Hive 还支持其他开窗函数,如 LEAD()(获取后一行的值)、PERCENT_RANK()(计算百分位排名)和 NTILE()(将数据分为若干个桶或组)。熟练掌握这些函数对于提升 Hive 查询的灵活性和实用性至关重要。

    SQL Server 总结复习 (二)

    在SQL Server中,数据库操作和数据分析常常涉及到对数据的排序和排名,这正是`ROW_NUMBER()`,`RANK()`,`DENSE_RANK()`以及`NTILE()`等排名函数的用武之地。这些函数可以帮助我们更好地理解和处理数据集,特别是在...

    SQL Server 2005 提供了4个行号排序函数

    通过以上介绍可以看出,`ROW_NUMBER()`、`RANK()`、`DENSE_RANK()` 和 `NTILE()` 这四个行号排序函数在实现分页查询、排名统计等方面有着重要的应用价值。合理地使用这些函数,不仅可以简化查询语句,还能提高查询...

    oracle分析函数

    - 排序(ORDER BY):在每个分区内定义行的顺序,这对于RANK, DENSE_RANK, ROW_NUMBER等排名函数至关重要。 3. **分析函数实例** - **RANK, DENSE_RANK, ROW_NUMBER**:这三个函数都用于为每行分配一个唯一的排名...

    oracle分析函数.doc

    - 排序函数:`RANK()`, `DENSE_RANK()`, `ROW_NUMBER()`,用于为数据行分配唯一的排名。 - 分组函数:如`NTILE()`,将数据行分成等大小或不等大小的组。 - 首尾函数:`FIRST_VALUE()`, `LAST_VALUE()`,返回指定...

    oracle 的几个分析函数

    ROW_NUMBER()函数为每一行分配一个唯一的整数,通常用于排序后的结果集。这个数字从1开始递增,对于每个新的分组或排序顺序,数字会重新开始。例如,以下SQL语句将返回每个部门员工的编号: ```sql SELECT ...

Global site tag (gtag.js) - Google Analytics