的Oracle开发的分析功能(等级,dense_rank,row_number)
在以前的导言中,介绍了由Oracle开发的解析函数,我们认识到解析函数的基本应用。现在让我们考虑以下问题。
(1)根据订单总数对所有客户进行排序
按地区和客户订单排序
找出总订单的前13名客户
找出最高和最低订单的客户
找出总订单的前25%名客户
根据前一篇文章的思路,我们只能对每组数据进行统计。如果我们需要等级,那么我们只需要添加行号,如果事实是如此简单,让我们来实践它。
(1)测试环境:
复制代码代码如下:SQL> DESC user_order;
名称零式
-----------------------------------------------------------------------------
region_id号(2)
customer_id号(2)
customer_sales数
(2)测试数据:
复制代码代码如下:SQL >选择*从user_order顺序customer_sales;
region_id customer_id customer_sales
= =
五千一百一十五万一千一百六十二
十亿二千九百九十万三千三百八十三
六千七百九十七万一千五百八十五
十亿二千八百九十八万六千九百六十四
九十二亿一千一百零二万零五百四十一
九十二亿二千一百零三万六千一百四十六
八十一亿六千一百零六万八千四百六十七
六亿八千一百一十四万一千六百三十八
五亿三千一百一十六万一千二百八十六
五亿五千一百一十六万九千九百二十六
八十一亿九千一百一十七万四千四百二十一
七十一亿二千一百一十八万二千二百七十五
七十一亿一千一百一十九万零四百二十一
六十一亿零一百一十九万六千七百四十八
六亿九千一百二十万八千九百五十九
一百零三亿零一百二十一万六千八百五十八
五亿二千一百二十二万四千九百九十二
九十二亿四千一百二十二万四千九百九十二
九十二亿三千一百二十二万四千九百九十二
八十一亿八千一百二十五万三千八百四十
七十一亿五千一百二十五万五千五百九十一
七十一亿三千一百三十一万零四百三十四
一百零二亿七千一百三十二万二千七百四十七
八十二亿零一百四十一万三千七百二十二
六亿六千一百七十八万八千八百三十六
一百零二亿六千一百八十万八千九百四十九
五亿四千一百八十七万八千二百七十五
七十一亿四千一百九十二万九千七百七十四
八十一亿七千一百九十四万四千二百八十一
九十二亿五千二百二十三万二千七百零三
选择30行。
请注意,3条记录,订单总额是相同的。如果我们需要屏幕的前12大客户的现在,如果我们使用rownum会发生什么
复制代码如下:SQL >行号,T *
从(选择*)
从user_order
通过customer_sales倒序)T
Where rownum < = 12
通过customer_sales倒序;
region_id customer_id customer_sales ROWNUM
---------------------------------------------
一百九十二亿五千二百二十三万二千七百零三
二百八十一亿七千一百九十四万四千二百八十一
三百七十一亿四千一百九十二万九千七百七十四
四十五亿四千一百八十七万八千二百七十五
五千一百零二亿六千一百八十万八千九百四十九
六十六亿六千一百七十八万八千八百三十六
七百八十二亿零一百四十一万三千七百二十二
八千一百零二亿七千一百三十二万二千七百四十七
九百七十一亿三千一百三十一万零四百三十四
一千零七十一亿五千一百二十五万五千五百九十一
一千一百八十一亿八千一百二十五万三千八百四十
一百二十五亿二千一百二十二万四千九百九十二
选择12行。
很明显,如果你只是把它简单的行号,我们错失了两次其他记录(参考上面的结果)。
两。使用分析功能记录排名:
针对以上情况,Oracle已经从8i分析功能:提供3兰特,dense_rank和row_number解决此类问题。让我们来看看这3种分析函数的功能及其区别。
等级,dense_rank,row_number函数生成一个自然数从1到N的每个记录,和N的值可能小于等于总记录数。这3个函数的唯一区别是排名策略时,相同的数据。
(1)row_number:
的row_number函数返回一个唯一的值,当相同的数据时,排名依次增大的顺序记录。
dense_rank:
的dense_rank函数返回一个唯一的价值,除非同一数据的排名是相同的在这个时候遇到相同的数据。
秩:
秩函数返回一个唯一值。当所有数据相同时,所有相同的数据将同时排列。同时,它将离开最后一个记录和下一个记录之间的等级。
这样的介绍有点难以理解。让我们举例说明它。下面的示例演示了当遇到相同数据时3种不同函数的不同排序策略。
复制代码如下:SQL >选择region_id,customer_id,(customer_sales)总金额,
等级()在(按金额(customer_sales)降序)等级,
dense_rank()结束(以金额(customer_sales)降序)dense_rank,
row_number()结束(以金额(customer_sales)降序)row_number
从user_order
集团通过region_id,customer_id;
region_id customer_id总排名dense_rank row_number
-------------------------------------------------------------
八千一百八十一兆二千五百三十八亿四千零一十一万一千一百一十一
五百二十一兆二千二百四十九亿九千二百一十二万一千二百一十二
九千二百三十一兆二千二百四十九亿九千二百一十二万一千二百一十三
九千二百四十一兆二千二百四十九亿九千二百一十二万一千二百一十四
一万零三百零一兆二千一百六十八亿五千八百一十五万一千三百一十五
选择30行。
请注意上面的绿色和明亮部分,生动地展示了3种不同的排名策略:
(1)对于第一个记录,3个函数都相同:12。
2。当第二相同的记录出现,等级和dense_rank仍然给了同级别的12,而row_number增加13,然后第三个类似的记录。
(3)当排名进入到下一个记录,我们可以看到,秩函数腾出13,14 12和15之间的排名,因为2的排名实际上已经由第二占,第三个相同的记录,dense_rank订单increasing.row_number功能也依次增加
比较以上3种不同的策略,我们必须根据客户的需要来选择。
(1)如果客户只需要指定数量的记录,然后row_number使用最简单,但风险缺少记录
如果客户需要的所有记录,达到一流水平,这是一个很好的选择,采用秩和dense_rank.as为选择哪一个,看客户的需求,选择dense_rank或获得最大的记录
三。分析功能用于记录组的排序。
上面的排名是根据订单的总量排列的,现在和将来:如果是在每个地区的订单总量排序这意味着另一个组操作:记录分组在区域,然后排名。幸运的是,Oracle也提供这样的支持。我们需要做的是在函数命令前面添加分组子句:分区region_id。
复制代码如下:SQL >选择region_id,customer_id,
(customer_sales)总金额,
等级()在(分区region_id)
为了总结(customer_sales)降序)等级,
dense_rank()在(分区region_id)
为了总结(customer_sales)降序)dense_rank,
row_number()在(分区region_id)
为了总结(customer_sales)降序)row_number
从user_order
集团通过region_id,customer_id;
region_id customer_id总排名dense_rank row_number
-------------------------------------------------------------
五千四百一十八亿七千八百二十七万五千一百一十一
五千二百一十二亿二千四百九十九万二千二百二十二
五千五百一十一亿六千九百九十二万六千三百三十三
六千六百一十七亿八千八百八十三万六千一百一十一
六千九百一十二亿零八百九十五万九千二百二十二
六兆一千零一十一亿九千六百七十四万八千三百三十三
选择30行。
我们现在所看到的排序将基于所有区域,而不是所有区域,排列函数中的分区子句的功能是将结果集分成几个部分,以便将置换函数应用到子集上。
5个问题我们已经解决了2以上(1,2),和其余3个问题(顶部/底部,第一/最后,NTile)将在下一个解释。
以上是Oracle的排名,dense_rank,对所有内容的使用row_number功能,希望能给大家一个参考,也希望你有很多的支持。