Oracle开发分析功能(顶部/底部,第一/最后,ntile)
在这篇文章中等级,dense_rank和row_number由Oracle开发什么如果在设置数据空值
复制代码如下:SQL >选择region_id,customer_id,
和(customer_sales)cust_sales,
金额(金额(customer_sales))在(分区region_id)ran_total,
等级()在(分区region_id)
为了总结(customer_sales)降序)等级
从user_order
集团通过region_id,customer_id;
region_id customer_id cust_sales ran_total秩
离开
一千零三十一亿六千二百三十八万九千零一十一
十万二千六百一十八兆零八百九十四亿九千六百二十三万八千九百零一
十万二千七百一十三兆二千二百七十四亿七千六百二十三万八千九百零一
十万三千零一十二兆一千六百八十五亿八千六百二十三万八千九百零一
十万二千八百九十八兆六千九百六十四亿六千二百三十八万九千零一十五
十万二千九百九十兆三千三百八十三亿六千二百三十八万九千零一十六
我们看到,有一个记录的cust_total字段的值为空,但它是放在第一位!显然这是不合理的,因此我们重新调整我们的排名策略,看看下面的语句:
复制代码如下:SQL >选择region_id,customer_id,
和(customer_sales)cust_total,
金额(金额(customer_sales))在(分区region_id)reg_total,
等级()在(分区region_id)
为了总结(customer_sales)DESC nulls last)等级
从user_order
集团通过region_id,customer_id;
region_id customer_id cust_total reg_total秩
离开
十万二千六百一十八兆零八百九十四亿九千六百二十三万八千九百零一
十万二千七百一十三兆二千二百七十四亿七千六百二十三万八千九百零一
十万三千零一十二兆一千六百八十五亿八千六百二十三万八千九百零一
十万二千八百九十八兆六千九百六十四亿六千二百三十八万九千零一十四
十万二千九百九十兆三千三百八十三亿六千二百三十八万九千零一十五
一千零三十一亿六千二百三十八万九千零一十六
绿色亮点,空最后/第一告诉Oracle在列表末尾的空值。
注意是空,不空。
二、顶部底部/ n查询:
在日常的生产工作中,我们经常遇到这样的一个问题:找到客户的前5名,找前10名销售人员等等。这对我们来说是个很简单的问题:
{ 1 }找出全部订单中的前3名最大客户:
复制代码代码如下:
从region_id(选择,
customer_id,
和(customer_sales)cust_total,
等级()()在(以金额(customer_sales)DESC nulls last)等级
从user_order
集团通过region_id,customer_id)
其中秩<3;
region_id customer_id cust_total秩
-----------------------------------------
九百二十五亿二千二百三十二万七千零三十一
八百一十七亿一千九百四十四万二千八百一十二
七百一十四亿一千九百二十九万七千七百四十三
SQL >
{ 2 }找出每个地区前3名客户中的前3名:
复制代码代码如下:
从region_id(选择,
customer_id,
和(customer_sales)cust_total,
金额(金额(customer_sales))在(分区region_id)reg_total,
等级()在(分区region_id)
为了总结(customer_sales)DESC nulls last)等级
从user_order
集团通过region_id,customer_id)
其中秩<3;
region_id customer_id cust_total reg_total秩
离开
五万四千一百八十七兆八千二百七十五亿五千五百八十五万六千四百一十一
五万二千一百二十二兆四千九百九十二亿五千五百八十五万六千四百一十二
五万五千一百一十六兆九千九百二十六亿五千五百八十五万六千四百一十三
六万六千一百七十八兆八千八百三十六亿六千三百零七万七千六百六十一
六万九千一百二十兆八千九百五十九亿六千三百零七万七千六百六十二
六十一万零一百一十九兆六千七百四十八亿六千三百零七万七千六百六十三
七十一万四千一百九十二兆九千七百七十四亿六千八百六十八万四千九百五十一
七十一万三千一百三十一兆零四百三十四亿六千八百六十八万四千九百五十二
七十一万五千一百二十五兆五千五百九十一亿六千八百六十八万四千九百五十三
八十一万七千一百九十四兆四千二百八十一亿六千八百五十四万七千三百一十一
八十二万零一百四十一兆三千七百二十二亿六千八百五十四万七千三百一十二
八十一万八千一百二十五兆三千八百四十亿六千八百五十四万七千三百一十三
九十二万五千二百二十三兆二千七百零三亿六千七百三十九万三千七百四十一
九十二万三千一百二十二兆四千九百九十二亿六千七百三十九万三千七百四十二
九十二万四千一百二十二兆四千九百九十二亿六千七百三十九万三千七百四十二
十万二千六百一十八兆零八百九十四亿九千六百二十三万八千九百零一
十万二千七百一十三兆二千二百七十四亿七千六百二十三万八千九百零一
十万三千零一十二兆一千六百八十五亿八千六百二十三万八千九百零一
选择18行。
三,第一/最后一级查询:
想象一下:找到一个拥有最大和最少的订单的客户。根据我们所学的知识,这至少需要2个查询。第一个查询是为了得到第一个位置而下降的,第二个查询是为了得到姓氏而按顺序排列的。因为排名函数只告诉我们排名的结果,它不能自动筛选我们的结果。
幸运的是,Oracle在置换函数之外为我们提供了两个额外的函数:第一,最后一个函数,专门用来解决这个问题:
复制代码如下:SQL >选择min(customer_id)
保持(dense_rank第一阶的总和(customer_sales)降序)第一,
min(customer_id)
保持(dense_rank最后订单金额(customer_sales)降序)上
从user_order
集团通过customer_id;
第一个
雇佣
三百一十一
这里有些地方看起来很可疑:
(1)为什么在这里使用MIN函数
这东西是什么东西
(3)拳头/最后做什么
(4)dense_rank和dense_rank之间的区别是什么(),它可以变成排名
首先,回答第一个问题:min函数的作用是确保当有多个第一个/最后一个案例时,返回唯一的记录。如果我们去掉它,会发生什么
复制代码代码如下:SQL >选择保持(dense_rank第一阶的总和(customer_sales)降序)第一,
保持(dense_rank最后订单金额(customer_sales)降序)上
从user_order
集团通过customer_id;
选择保留(dense_rank第一阶的总和(customer_sales)降序)第一,
*
第1行错误:
ora-00907:缺少右括号
然后再看第二个问题:保管有什么用根据以上结果,我们已经知道Oracle只保留了2个数据作为排名的结果,这就是保存的作用,告诉Oracle保持与保存状态一致的记录。
那么什么是合格记录呢这是第三question.dense_rank是告诉Oracle配置策略,和第一/最后告诉的条件,最终筛选。
第四个问题:如果我们改变dense_rank排名呢
复制代码如下:SQL >选择min(region_id)
保持(排名第一的订单金额(customer_sales)降序)第一,
min(region_id)
保持(排名最后的总和(customer_sales)降序)上
从user_order
集团通过region_id;
选择最小(region_id)
*
第1行错误:
ora-02000:失踪的dense_rank
四。询问级别:
现在我们已经看到了如何通过Oracle的分析功能获得顶部/底部n、第一个和最后一个记录,有时我们得到如下需求:找到总订单的前1名/ 5名的客户。
是不是很熟悉,不是吗我们立即想到的方法提到的第二点,但秩函数只有当我们不知道排名,排名相对位置在整体排名中,介绍了ntile另一分析功能,下面我们就以上述需求为例说明:
复制代码代码如下:SQL >选择region_id,
customer_id,
(5)在ntile(订单金额(customer_sales)降序)直到
从user_order
集团通过region_id,customer_id;
region_id customer_id瓦
氨
一万零三百一十一
九千二百五十一
一万零二百六十一
六百六十一
八千一百八十二
五百二十二
九千二百三十三
六百九十三
七千一百一十三
五百三十四
六百八十四
八千一百六十四
六百七十五
一万零二百九十五
五百一十五
直到函数计算的在记录集的排序每个记录的比例。我们看到所有的记录被分为5个级别。如果我们只需要以前的1 / 5的记录,我们只需要截取1瓦的记录。如果我们需要一个前25%名的记录(即1/4),那么我们只需要设置ntile(4)。
以上是Oracle中前几篇、最后几篇、最多篇和层次查询的内容。我希望我们能给你一个参考,希望你能得到很多支持。