- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Oracle开发之分析函数(Rank, Dense_rank, row_number)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1、使用rownum为记录排名:
在前面一篇《Oracle开发之分析函数简介Over》,我们认识了分析函数的基本应用,现在我们再来考虑下面几个问题:
①对所有客户按订单总额进行排名 ②按区域和客户订单总额进行排名 ③找出订单总额排名前13位的客户 ④找出订单总额最高、最低的客户 ⑤找出订单总额排名前25%的客户 。
按照前面第一篇文章的思路,我们只能做到对各个分组的数据进行统计,如果需要排名的话那么只需要简单地加上rownum不就行了吗?事实情况是否如此想象般简单,我们来实践一下.
【1】测试环境:
。
。
。
Name Null? Type ----------------------------------------- -------- ---------------------------- REGION_ID NUMBER(2) CUSTOMER_ID NUMBER(2) CUSTOMER_SALES NUMBER 。
【2】测试数据:
。
。
REGION_ID CUSTOMER_ID CUSTOMER_SALES ---------- ----------- -------------- 5 1 151162 10 29 903383 6 7 971585 10 28 986964 9 21 1020541 9 22 1036146 8 16 1068467 6 8 1141638 5 3 1161286 5 5 1169926 8 19 1174421 7 12 1182275 7 11 1190421 6 10 1196748 6 9 1208959 10 30 1216858 5 2 1224992 9 24 1224992 9 23 1224992 8 18 1253840 7 15 1255591 7 13 1310434 10 27 1322747 8 20 1413722 6 6 1788836 10 26 1808949 5 4 1878275 7 14 1929774 8 17 1944281 9 25 2232703 。
30 rows selected. 。
注意这里有3条记录的订单总额是一样的。假如我们现在需要筛选排名前12位的客户,如果使用rownum会有什么样的后果呢?
。
。
ROWNUM REGION_ID CUSTOMER_ID CUSTOMER_SALES ---------- ---------- ----------- -------------- 1 9 25 2232703 2 8 17 1944281 3 7 14 1929774 4 5 4 1878275 5 10 26 1808949 6 6 6 1788836 7 8 20 1413722 8 10 27 1322747 9 7 13 1310434 10 7 15 1255591 11 8 18 1253840 12 5 2 1224992 。
12 rows selected. 。
很明显假如只是简单地按rownum进行排序的话,我们漏掉了另外两条记录(参考上面的结果).
2、使用分析函数来为记录排名:
针对上面的情况,Oracle从8i开始就提供了3个分析函数:rand,dense_rank,row_number来解决诸如此类的问题,下面我们来看看这3个分析函数的作用以及彼此之间的区别:
Rank,Dense_rank,Row_number函数为每条记录产生一个从1开始至N的自然数,N的值可能小于等于记录的总数。这3个函数的唯一区别在于当碰到相同数据时的排名策略.
①ROW_NUMBER:
Row_number函数返回一个唯一的值,当碰到相同数据时,排名按照记录集中记录的顺序依次递增.
②DENSE_RANK: Dense_rank函数返回一个唯一的值,除非当碰到相同数据时,此时所有相同数据的排名都是一样的.
③RANK: Rank函数返回一个唯一的值,除非遇到相同的数据时,此时所有相同数据的排名是一样的,同时会在最后一条相同记录和下一条不同记录的排名之间空出排名.
这样的介绍有点难懂,我们还是通过实例来说明吧,下面的例子演示了3个不同函数在遇到相同数据时不同排名策略:
。
。
REGION_ID CUSTOMER_ID TOTAL RANK DENSE_RANK ROW_NUMBER ---------- ----------- ---------- ---------- ---------- ---------- 8 18 1253840 11 11 11 5 2 1224992 12 12 12 9 23 1224992 12 12 13 9 24 1224992 12 12 14 10 30 1216858 15 13 15 。
30 rows selected. 。
请注意上面的绿色高亮部分,这里生动的演示了3种不同的排名策略:
①对于第一条相同的记录,3种函数的排名都是一样的:12 。
②当出现第二条相同的记录时,Rank和Dense_rank依然给出同样的排名12;而row_number则顺延递增为13,依次类推至第三条相同的记录 。
③当排名进行到下一条不同的记录时,可以看到Rank函数在12和15之间空出了13,14的排名,因为这2个排名实际上已经被第2、三条相同的记录占了。而Dense_rank则顺序递增。row_number函数也是顺序递增 。
比较上面3种不同的策略,我们在选择的时候就要根据客户的需求来定夺了:
①假如客户就只需要指定数目的记录,那么采用row_number是最简单的,但有漏掉的记录的危险 。
②假如客户需要所有达到排名水平的记录,那么采用rank或dense_rank是不错的选择。至于选择哪一种则看客户的需要,选择dense_rank或得到最大的记录 。
3、使用分析函数为记录进行分组排名:
上面的排名是按订单总额来进行排列的,现在跟进一步:假如是为各个地区的订单总额进行排名呢?这意味着又多了一次分组操作:对记录按地区分组然后进行排名。幸亏Oracle也提供了这样的支持,我们所要做的仅仅是在over函数中order by的前面增加一个分组子句:partition by region_id.
。
。
REGION_ID CUSTOMER_ID TOTAL RANK DENSE_RANK ROW_NUMBER ---------- ----------- ---------- ---------- ---------- ---------- 5 4 1878275 1 1 1 5 2 1224992 2 2 2 5 5 1169926 3 3 3 6 6 1788836 1 1 1 6 9 1208959 2 2 2 6 10 1196748 3 3 3 。
30 rows selected. 。
现在我们看到的排名将是基于各个地区的,而非所有区域的了!Partition by 子句在排列函数中的作用是将一个结果集划分成几个部分,这样排列函数就能够应用于这各个子集.
前面我们提到的5个问题已经解决了2个了(第1,2),剩下的3个问题(Top/Bottom N,First/Last, NTile)会在下一篇讲解.
以上就是Oracle中Rank, Dense_rank, row_number各个函数用法的全部内容,希望能给大家一个参考,也希望大家多多支持我.
最后此篇关于Oracle开发之分析函数(Rank, Dense_rank, row_number)的文章就讲到这里了,如果你想了解更多关于Oracle开发之分析函数(Rank, Dense_rank, row_number)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试找出一种计算排名的方法。现在它只需要每个条目的赢/输的比率,所以例如100 次中,有 99 次获胜,则胜率达到 99%。但如果一个参赛作品在 1 票中赢得 1 票,那么它的获胜排名将是 10
我尝试了以下操作,但它没有对每个类别进行明智的排名。相反,在不考虑类别的情况下对所有记录进行排名。我希望每个类别重新出现排名 select rs.Section,rs.Field1,rs.Field
如何获得在分区更改时重新启动的 RANK?我有这张表: ID Date Value 1 2015-01-01 1 2 2015-01-02 1 1; 关于
由于我们可以使用 row_number() 获得分配的行号如果我们想使用 dense_rank() 在不跳过分区内的任何数字的情况下找到每一行的排名,我们为什么需要rank()功能,我想不出任何用例
我很难搜索可以帮助我构建文本序列(特征)分类器的文档、研究或博客。我拥有的文本序列包含网络日志。 我正在使用 TensorFlow 构建 GRU 模型,并将 SVM 作为分类函数。我在处理张量形状时遇
我遇到了这类错误。 colsys.f:1367.51: 1 NOLD, ALDIF, K, NCOMP, M, MSTAR, 3,DUMM,0)
import tensorflow as tf x = [[1,2,3],[4,5,6]] y = [0,1] z = [1,2] x = tf.constant(x) y = tf.constant
我在学习 SQL 中的排名函数,发现它使用的排名与 pandas 方法不同。如何得到相同的答案? 提问链接:https://www.windowfunctions.com/questions/rank
在 SQL Server 数据库中,我有一个我对排名感兴趣的值表。 当我执行 RANK() OVER (ORDER BY VALUE DESC) 作为 RANK 时,我得到以下结果(在假设表中): R
我有一个包含以下字段的游戏 table : ID Name Email Points ---------------------------------- 1 Jo
我有以下 TensorFlow 代码: layer_1 = tf.add(tf.matmul(tf.cast(x, tf.float32), weights['h1']), biases['b1'])
我是 Sentdex 教程的神经网络新手。我尝试运行该代码: import tensorflow as tf from tensorflow.examples.tutorials.mnist i
我是 tensorflow 的新手,我正在尝试将双向 LSTM 的一些代码从旧版本的 tensorflow 更新到最新版本 (1.0),但我收到此错误: Shape must be rank 2 bu
我正在使用以下格式的数据集: Column 1 (What I Have), Column 2 (What I need to see) 8 1 8 1 8 1 9 2 9
我有一个 Keras 函数模型(具有卷积层的神经网络),它可以很好地与 tensorflow 配合使用。我可以运行它,我可以适应它。 但是,使用tensorflow gpu时无法建立模型。 这是构建模
MPI 中的进程以什么顺序执行?我的意思是排名明智的顺序? 例如:rank == 0 首先,rank == 1 接下来? 我通过在运行时给出以下命令来考虑两个过程: mpirun -np 2 示例。
我正在尝试使用 cvxpy(因此使用 cvxopt)在具有 28 个节点和 37 条线路的相对简单的网络中对最佳功率流进行建模,但得到的是“Rank(A) < p or Rank([G; A] ) <
我是 tensorflow 的新手,我正在做一些在线练习以熟悉 tensorflow。我要执行以下任务: Create two tensors x and y of shape 300 from an
我有一个 Ubuntu 对话语料库的 .tfrecords 文件。我正在尝试读取整个数据集,以便我可以将上下文和话语分成几批。使用 tf.parse_single_example 我能够阅读一个示例。
实际上我们不能在 if 语句中使用 tf.var 作为 bool 来代替使用 tf.cond。我为规范化输入数据编写了这段代码,但出现了令人困惑的错误,我哪里做错了? def global_co
我是一名优秀的程序员,十分优秀!