SQL语句中的rank () over , row_number() over ,rank_dense ()实现排序
SQL语句中的rank () over , row_number() over ,rank_dense ()
总结如下:
我创建了一个表,数据如下,
SQL> select * from test;
A1 A2
---------- ----------
1 3
2 4
3 2
3 5
4 2
然后用rank () over,
SQL> select a1,a2,rank () over (order by a1) rank from test;
A1 A2 RANK
---------- ---------- ----------
1 3 1
2 4 2
3 2 3
3 5 3
4 2 5
SQL> select a1,a2,rank () over (order by a2) rank from test;
A1 A2 RANK
---------- ---------- ----------
3 2 1
4 2 1
1 3 3
2 4 4
3 5 5
原来这个就是用来看排名的东东啊。
接下来看看row_number() over,
SQL> select a1,a2, row_number () over (order by a1) rank from test;
A1 A2 RANK
---------- ---------- ----------
1 3 1
2 4 2
3 2 3
3 5 4
4 2 5
SQL> select a1,a2, row_number () over (order by a2) rank from test;
A1 A2 RANK
---------- ---------- ----------
3 2 1
4 2 2
1 3 3
2 4 4
3 5 5
黄色标出了区别,这个很容易看清楚吧~~~
再看看dense_rank () over
SQL> select a1,a2, dense_rank () over (order by a1) rank from test;
A1 A2 RANK
---------- ---------- ----------
1 3 1
2 4 2
3 2 3
3 5 3
4 2 4
dense_rank在有出现相同的rank后,rank的值是紧接上一次的rank值。
可以这么理解,我们通常意义上的top N 的实现应该采用row_number() over 而不是rank () over,因为row_number 是给记录加一个序号标记,而rank 是相当于进行排序后的排名,也就是如果排序列是相同的,那么他们的返回值也是相同的,而row_number则不可能返回相同值。
放到一起看看吧:
SQL> select a1,a2,
2 rank () over (order by a1) rank,
3 dense_rank () over (order by a1) dense_rank,
4 row_number () over (order by a1) row_number
5 from test;
A1 A2 RANK DENSE_RANK ROW_NUMBER
---------- ---------- ---------- ---------- ----------
1 3 1 1 1
2 4 2 2 2
3 2 3 3 3
3 5 3 3 4
4 2 5 4 5
row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序).
rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内).
dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的
我创建了一个表,数据如下,
SQL> select * from test;
A1 A2
---------- ----------
1 3
2 4
3 2
3 5
4 2
然后用rank () over,
SQL> select a1,a2,rank () over (order by a1) rank from test;
A1 A2 RANK
---------- ---------- ----------
1 3 1
2 4 2
3 2 3
3 5 3
4 2 5
SQL> select a1,a2,rank () over (order by a2) rank from test;
A1 A2 RANK
---------- ---------- ----------
3 2 1
4 2 1
1 3 3
2 4 4
3 5 5
原来这个就是用来看排名的东东啊。
接下来看看row_number() over,
SQL> select a1,a2, row_number () over (order by a1) rank from test;
A1 A2 RANK
---------- ---------- ----------
1 3 1
2 4 2
3 2 3
3 5 4
4 2 5
SQL> select a1,a2, row_number () over (order by a2) rank from test;
A1 A2 RANK
---------- ---------- ----------
3 2 1
4 2 2
1 3 3
2 4 4
3 5 5
黄色标出了区别,这个很容易看清楚吧~~~
再看看dense_rank () over
SQL> select a1,a2, dense_rank () over (order by a1) rank from test;
A1 A2 RANK
---------- ---------- ----------
1 3 1
2 4 2
3 2 3
3 5 3
4 2 4
dense_rank在有出现相同的rank后,rank的值是紧接上一次的rank值。
可以这么理解,我们通常意义上的top N 的实现应该采用row_number() over 而不是rank () over,因为row_number 是给记录加一个序号标记,而rank 是相当于进行排序后的排名,也就是如果排序列是相同的,那么他们的返回值也是相同的,而row_number则不可能返回相同值。
放到一起看看吧:
SQL> select a1,a2,
2 rank () over (order by a1) rank,
3 dense_rank () over (order by a1) dense_rank,
4 row_number () over (order by a1) row_number
5 from test;
A1 A2 RANK DENSE_RANK ROW_NUMBER
---------- ---------- ---------- ---------- ----------
1 3 1 1 1
2 4 2 2 2
3 2 3 3 3
3 5 3 3 4
4 2 5 4 5
row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序).
rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内).
dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的
相关推荐
select dense_rank() over(order by field1),* from t_table order by field1 ``` 查询结果如图8所示(假设图8展示了使用dense_rank后的序号分布)。 四、ntile ntile函数则有所不同,它不是为每行分配一个唯一的...
此外,`ROW_NUMBER()`函数还有其他窗口函数,如`RANK()`和`DENSE_RANK()`,它们在某些场景下可能会提供更灵活的解决方案。但在这里,我们主要关注`ROW_NUMBER()`在分页中的应用。 总结起来,`ROW_NUMBER()`函数在...
总结来说,ROW_NUMBER()、RANK()和DENSE_RANK()在SQL Server 2005中提供了强大的数据排序和分组功能,能够帮助用户更灵活地处理和分析复杂的数据集,提高查询效率。在实际应用中,应根据具体需求选择适合的排名函数...
例如,以下SQL语句将`emp`表中的员工按`rownum`排序,并用`row_number()`重新分配序号: ```sql select rownum, ename, job, row_number() over (order by rownum) as row_number from emp; ``` 在这个例子中,`...
SQL Server 2005 排名函数比较 ...row_number 函数可以用于实现查询表中指定范围的记录或实现分页功能,rank 函数和 dense_rank 函数用于考虑排序字段值相同的情况,ntile 函数用于将查询结果分为多个组。
SQL 获取顺序号的四种方法:IDENTITY、RANK、DENSE_RANK、ROW_NUMBER 在 SQL 中,获取顺序号是非常常见的操作。今天,我们将讨论四种获取顺序号的方法:IDENTITY、RANK、DENSE_RANK、ROW_NUMBER。每种方法都有其优...
除了`ROW_NUMBER()`之外,SQL还提供了另外两个类似的函数——`RANK()`和`DENSE_RANK()`,它们都可以用来为结果集中的行分配排名,但具体的计算方式有所不同: 1. **ROW_NUMBER()**:对于每个分区内的每一行,都会...
在SQL查询中,排序和分组数据是常见的需求,而`ROW_NUMBER()`, `RANK()`, 和 `DENSE_RANK()` 这三个函数都用于为结果集中的每一行分配一个唯一的排名值,但它们之间存在微妙的区别。这篇文章将深入探讨这三个窗口...
除了基本的行号分配,ROW_NUMBER() OVER还可以与其他窗口函数如RANK()和DENSE_RANK()结合使用,以实现更复杂的排名需求。例如,RANK()会跳过相同的行号,而DENSE_RANK()则不会。这些函数对于数据分析、报表生成以及...
- **使用RANK()和DENSE_RANK()函数**:这两个函数与ROW_NUMBER()类似,但处理重复值的方式不同,适合某些特定场景。 - **使用存储过程**:在数据库中创建存储过程,可以封装复杂的分页逻辑,包括计算总页数、确定...
在这个"PLSQL做排名的语句样本.tar"压缩包中,很显然包含了一些关于如何在PL/SQL中实现数据排名的示例代码。下面我们将详细探讨这个主题。 首先,我们来理解“排名”在SQL中的含义。在数据分析中,排名经常用于对...
Oracle数据库提供了多种方法来实现分页查询,其中包括使用ROWNUM伪列、游标(CURSOR)以及Oracle的高级分页功能如ROW_NUMBER()、RANK()和DENSE_RANK()等。 1. ROWNUM伪列: ROWNUM是Oracle数据库特有的一个伪列,它...
通过以上介绍可以看出,`ROW_NUMBER()`、`RANK()`、`DENSE_RANK()` 和 `NTILE()` 这四个行号排序函数在实现分页查询、排名统计等方面有着重要的应用价值。合理地使用这些函数,不仅可以简化查询语句,还能提高查询...
- **rank()** 和 **dense_rank()**:与 `row_number()` 类似,但当遇到相同排序值时,`rank()` 会跳过一些行号,而 `dense_rank()` 不会。 #### 拓展应用 - **数据排名**:可以使用 `row_number()` 来确定数据集中...
其中`GROUP BY`、`ORDER BY`、`OVER`子句以及`ROW_NUMBER()`、`RANK()`、`DENSE_RANK()`等分析函数都是非常有用的工具。在实际应用中,根据具体的需求选择合适的工具和技术组合可以大大提高数据处理的效率和灵活性。...
在Oracle数据库系统中,实现分页查询通常使用ROWNUM伪列或者结合RANK()、DENSE_RANK()、ROW_NUMBER()等窗口函数。这里我们将详细探讨这些方法及其应用场景。 首先,ROWNUM是一个特殊的伪列,它在查询执行时为每一行...
7. **数据库兼容性**:虽然此方法主要适用于SQL Server,但其他数据库系统如Oracle和MySQL也有类似的功能,如`RANK()`、`DENSE_RANK()`等,可以根据不同的数据库系统进行适配。 8. **事务与并发**:在高并发环境下...
在给定的标题和描述中,我们可以看到一个利用`row_number()`函数实现这一功能的SQL语句。下面将详细解释这个语句的工作原理以及如何使用它。 首先,让我们分解这个查询: 1. `select t.*, row_number() over(order...
为了解决这个问题,Oracle引入了RANK(), DENSE_RANK(), 和 ROW_NUMBER()这三个窗口函数,它们可以在更复杂的查询场景下实现分页。 例如,使用ROW_NUMBER()实现分页: ```sql SELECT * FROM ( SELECT ROW_NUMBER()...
在数据库查询语言SQL中,"排名,密集排名,非密集排名"这三种概念是用于处理...对于大数据量的场景,推荐使用窗口函数如`RANK()`, `DENSE_RANK()`, 和 `ROW_NUMBER()`,因为它们在性能方面通常优于传统子查询的方法。