婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Oracle開發之分析函數(Top/Bottom N、First/Last、NTile)

Oracle開發之分析函數(Top/Bottom N、First/Last、NTile)

熱門標簽:山東crm外呼系統軟件 百度地圖標注途經點 地圖標注養老院 開發外呼系統 哪個400外呼系統好 慧營銷crm外呼系統丹丹 哈爾濱電話機器人銷售招聘 愛客外呼系統怎么樣 圖吧網站地圖標注

一、帶空值的排列:

在前面《Oracle開發之分析函數(Rank、Dense_rank、row_number)》一文中,我們已經知道了如何為一批記錄進行全排列、分組排列。假如被排列的數據中含有空值呢?

復制代碼 代碼如下:
SQL> select region_id, customer_id,
         sum(customer_sales) cust_sales,
         sum(sum(customer_sales)) over(partition by region_id) ran_total,
         rank() over(partition by region_id
                  order by sum(customer_sales) desc) rank
    from user_order
   group by region_id, customer_id;

 REGION_ID CUSTOMER_ID CUST_SALES  RAN_TOTAL       RANK
---------- ----------- ---------- ---------- ----------
        10          31                    6238901          1
        10          26    1808949    6238901          2
        10          27    1322747    6238901          3
        10          30    1216858    6238901          4
        10          28     986964    6238901          5
        10          29     903383    6238901          6

我們看到這里有一條記錄的CUST_TOTAL字段值為NULL,但居然排在第一名了!顯然這不符合情理。所以我們重新調整完善一下我們的排名策略,看看下面的語句:

復制代碼 代碼如下:
SQL> select region_id, customer_id,
         sum(customer_sales) cust_total,
         sum(sum(customer_sales)) over(partition by region_id) reg_total,
         rank() over(partition by region_id 
                        order by sum(customer_sales) desc NULLS LAST) rank
        from user_order
       group by region_id, customer_id;

 REGION_ID CUSTOMER_ID CUST_TOTAL  REG_TOTAL       RANK
---------- ----------- ---------- ---------- ----------
        10          26    1808949     6238901           1
        10          27    1322747    6238901           2
        10          30    1216858    6238901           3
        10          28     986964     6238901           4
        10          29     903383     6238901           5
        10          31     6238901                           6

綠色高亮處,NULLS LAST/FIRST告訴Oracle讓空值排名最后后第一。

注意是NULLS,不是NULL。

二、Top/Bottom N查詢:

在日常的工作生產中,我們經常碰到這樣的查詢:找出排名前5位的訂單客戶、找出排名前10位的銷售人員等等。現在這個對我們來說已經是很簡單的問題了。下面我們用一個實際的例子來演示:

【1】找出所有訂單總額排名前3的大客戶:

復制代碼 代碼如下:
SQL> select *
  from (select region_id,
               customer_id,
               sum(customer_sales) cust_total,
               rank() over(order by sum(customer_sales) desc NULLS LAST) rank
         from user_order
         group by region_id, customer_id)
  where rank = 3;

 REGION_ID CUSTOMER_ID CUST_TOTAL       RANK
---------- ----------- ---------- ----------
         9          25    2232703          1
         8          17    1944281          2
         7          14    1929774          3

SQL>

【2】找出每個區域訂單總額排名前3的大客戶:

復制代碼 代碼如下:
SQL> select *
    from (select region_id,
                 customer_id,
                 sum(customer_sales) cust_total,
                 sum(sum(customer_sales)) over(partition by region_id) reg_total,
                 rank() over(partition by region_id
                                order by sum(customer_sales) desc NULLS LAST) rank
            from user_order
           group by region_id, customer_id)
   where rank = 3;

 REGION_ID CUSTOMER_ID CUST_TOTAL  REG_TOTAL       RANK
---------- ----------- ---------- ---------- ----------
         5           4    1878275    5585641          1
         5           2    1224992    5585641          2
         5           5    1169926    5585641          3
         6           6    1788836    6307766          1
         6           9    1208959    6307766          2
         6          10    1196748    6307766          3
         7          14    1929774    6868495          1
         7          13    1310434    6868495          2
         7          15    1255591    6868495          3
         8          17    1944281    6854731          1
         8          20    1413722    6854731          2
         8          18    1253840    6854731          3
         9          25    2232703    6739374          1
         9          23    1224992    6739374          2
         9          24    1224992    6739374          2
        10          26    1808949    6238901          1
        10          27    1322747    6238901          2
        10          30    1216858    6238901          3

18 rows selected.

三、First/Last排名查詢:

想象一下下面的情形:找出訂單總額最多、最少的客戶。按照前面我們學到的知識,這個至少需要2個查詢。第一個查詢按照訂單總額降序排列以期拿到第一名,第二個查詢按照訂單總額升序排列以期拿到最后一名。是不是很煩?因為Rank函數只告訴我們排名的結果,卻無法自動替我們從中篩選結果。

幸好Oracle為我們在排列函數之外提供了兩個額外的函數:first、last函數,專門用來解決這種問題。還是用實例說話:

復制代碼 代碼如下:
SQL> select min(customer_id)
         keep (dense_rank first order by sum(customer_sales) desc) first,
         min(customer_id)
         keep (dense_rank last order by sum(customer_sales) desc)
last
    from user_order
   group by customer_id;

     FIRST       LAST
---------- ----------
        31          1

這里有幾個看起來比較疑惑的地方:

①為什么這里要用min函數
②Keep這個東西是干什么的
③fist/last是干什么的
④dense_rank和dense_rank()有什么不同,能換成rank嗎?

首先解答一下第一個問題:min函數的作用是用于當存在多個First/Last情況下保證返回唯一的記錄。假如我們去掉會有什么樣的后果呢?

復制代碼 代碼如下:
SQL> select keep (dense_rank first order by sum(customer_sales) desc) first,
             keep (dense_rank last order by sum(customer_sales) desc) last
    from user_order
   group by customer_id;
select keep (dense_rank first order by sum(customer_sales) desc) first,
                        *

ERROR at line 1:
ORA-00907: missing right parenthesis

接下來看看第2個問題:keep是干什么用的?從上面的結果我們已經知道Oracle對排名的結果只“保留”2條數據,這就是keep的作用。告訴Oracle只保留符合keep條件的記錄。

那么什么才是符合條件的記錄呢?這就是第3個問題了。dense_rank是告訴Oracle排列的策略,first/last則告訴最終篩選的條件。

第4個問題:如果我們把dense_rank換成rank呢?

復制代碼 代碼如下:
SQL> select min(region_id)
          keep(rank first order by sum(customer_sales) desc) first,
         min(region_id)
          keep(rank last order by sum(customer_sales) desc) last
    from user_order
   group by region_id;
select min(region_id)
*

ERROR at line 1:
ORA-02000: missing DENSE_RANK

四、按層次查詢:

現在我們已經見識了如何通過Oracle的分析函數來獲取Top/Bottom N,第一個,最后一個記錄。有時我們會收到類似下面這樣的需求:找出訂單總額排名前1/5的客戶。

很熟悉是不?我們馬上會想到第二點中提到的方法,可是rank函數只為我們做好了排名,并不知道每個排名在總排名中的相對位置,這時候就引入了另外一個分析函數NTile,下面我們就以上面的需求為例來講解一下:

復制代碼 代碼如下:
SQL> select region_id,
         customer_id,
         ntile(5) over(order by sum(customer_sales) desc) til
    from user_order
   group by region_id, customer_id;

 REGION_ID CUSTOMER_ID       TILE
---------- ----------- ----------
        10          31          1
         9          25           1
        10          26          1
         6           6            1        
         8          18           2
         5           2            2
         9          23           3
         6           9            3
         7          11           3
         5           3            4
         6           8            4
         8          16           4
         6           7            5
        10          29          5
         5           1            5

Ntil函數為各個記錄在記錄集中的排名計算比例,我們看到所有的記錄被分成5個等級,那么假如我們只需要前1/5的記錄則只需要截取TILE的值為1的記錄就可以了。假如我們需要排名前25%的記錄(也就是1/4)那么我們只需要設置ntile(4)就可以了。

以上就是Oracle中前幾名、后幾名、最多、最少以及按層次查詢的全部內容,希望能給大家一個參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • Oracle開發之分析函數總結
  • Oracle開發之分析函數(Rank, Dense_rank, row_number)
  • Oracle開發之分析函數簡介Over用法
  • 深入探討:oracle中row_number() over()分析函數用法
  • Oracle 分析函數RANK(),ROW_NUMBER(),LAG()等的使用方法
  • 常用Oracle分析函數大全

標簽:周口 武漢 承德 甘肅 開封 和田 青島 固原

巨人網絡通訊聲明:本文標題《Oracle開發之分析函數(Top/Bottom N、First/Last、NTile)》,本文關鍵詞  Oracle,開,發之,分析,函數,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Oracle開發之分析函數(Top/Bottom N、First/Last、NTile)》相關的同類信息!
  • 本頁收集關于Oracle開發之分析函數(Top/Bottom N、First/Last、NTile)的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产欧美精品在线观看| 欧美成人三级电影在线| 欧美日韩亚洲丝袜制服| 欧美高清一级片在线观看| 免费成人性网站| 欧美videos大乳护士334| 蜜乳av一区二区三区| 91精品在线观看入口| 三级在线观看一区二区| 欧美一区二区三区在线看| 免费观看成人鲁鲁鲁鲁鲁视频| 7777精品久久久大香线蕉| 三级欧美韩日大片在线看| 欧美sm极限捆绑bd| 成人高清视频免费观看| 日韩精品91亚洲二区在线观看| 91网页版在线| 日日夜夜精品视频免费| 精品国产乱码久久久久久浪潮| 亚洲h精品动漫在线观看| 欧美电影一区二区| 国产成人精品一区二| 亚洲欧洲制服丝袜| 91超碰这里只有精品国产| 国产精品1024| 一区二区三区日韩欧美| 日韩免费高清电影| 91蜜桃在线观看| 美女视频黄免费的久久| 中文字幕一区二区在线播放| 欧日韩精品视频| 国产精品系列在线播放| 亚洲国产一区二区视频| 国产三级精品三级在线专区| 欧美日韩国产中文| 99久久久无码国产精品| 日本三级亚洲精品| 亚洲欧美色图小说| 国产欧美精品一区aⅴ影院| 高清视频一区二区| 欧美一级免费观看| 日本特黄久久久高潮| 欧美一区二区观看视频| 亚洲午夜久久久久久久久久久| 91精品国产入口在线| 亚洲精品水蜜桃| 欧美浪妇xxxx高跟鞋交| 久久99久久久久| 一级日本不卡的影视| 日韩视频在线观看一区二区| 成人黄色777网| 免费成人美女在线观看.| 夜夜精品视频一区二区| 国产精品久久久久久久久免费丝袜| 成人黄色一级视频| 国产一区二区福利| 青椒成人免费视频| 一区二区三区在线观看网站| 欧美国产日产图区| 99国产精品视频免费观看| 国产一区二区三区av电影 | 三级不卡在线观看| 97久久精品人人做人人爽| 精品日韩99亚洲| 国产盗摄精品一区二区三区在线| 久久av老司机精品网站导航| 日韩欧美亚洲一区二区| 国产精品久久久久久久午夜片| 国产成人在线免费观看| 日韩影视精彩在线| 午夜影视日本亚洲欧洲精品| 亚洲精品国产成人久久av盗摄| 亚洲天堂网中文字| 亚洲女人****多毛耸耸8| 久久视频一区二区| 美女看a上一区| 成人综合婷婷国产精品久久免费| 国产成人免费9x9x人网站视频| 91在线国产福利| 国内精品视频666| 色天天综合久久久久综合片| 国产成人精品1024| 色网综合在线观看| 欧美精品久久久久久久久老牛影院| 91精品久久久久久久99蜜桃| 91麻豆精品国产91| 中文字幕第一页久久| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美一区二区日韩| 欧美成人一区二区三区片免费| 成人欧美一区二区三区在线播放| 久久综合一区二区| 蜜臀99久久精品久久久久久软件| 91精品欧美久久久久久动漫| 久久久美女艺术照精彩视频福利播放| 亚洲人成小说网站色在线| 国产999精品久久| 欧美日韩国产高清一区二区| 337p粉嫩大胆色噜噜噜噜亚洲| 精品999久久久| 日韩精品一区二区三区四区视频| 亚洲免费av观看| 99久久国产免费看| 国产福利91精品一区| 国产精品一区二区黑丝| 久久国产精品72免费观看| 国产三级一区二区| 一区二区三区四区视频精品免费 | 狠狠久久亚洲欧美| jlzzjlzz亚洲日本少妇| 精品对白一区国产伦| 国内外成人在线| 欧美日韩中文国产| 日韩中文字幕区一区有砖一区 | 国产精品传媒在线| 久久99国产精品麻豆| 欧美色国产精品| 麻豆精品一区二区av白丝在线| 欧美日韩午夜精品| 国产一二精品视频| 中文字幕永久在线不卡| 色天天综合久久久久综合片| 亚洲福利视频三区| 肉色丝袜一区二区| 国产精品久久久久影院亚瑟| 欧美日韩一区二区三区视频| 欧美mv日韩mv亚洲| 亚洲在线观看免费视频| 亚洲国产精品ⅴa在线观看| 国产91在线看| 91精品国产欧美一区二区成人| 国产欧美日韩在线看| 91麻豆6部合集magnet| 久久久久国产精品麻豆ai换脸 | 久久激情五月婷婷| 欧美日本视频在线| 欧美理论电影在线| 成人高清视频在线| 亚洲chinese男男1069| 中文字幕亚洲一区二区va在线| 26uuu国产日韩综合| 欧美色综合网站| 欧美性受极品xxxx喷水| 中文字幕乱码久久午夜不卡| 99国产精品久久久久久久久久| **欧美大码日韩| 日本一区二区三区电影| 国产无一区二区| 亚洲一区在线观看视频| 精品污污网站免费看| 奇米色777欧美一区二区| 久久久久久电影| 欧美日韩在线播放| 国产不卡一区视频| 日韩av一级片| 亚洲图片欧美色图| 中文字幕乱码亚洲精品一区| 6080国产精品一区二区| 91麻豆福利精品推荐| 精品一区二区三区免费视频| 中文成人av在线| 最近日韩中文字幕| av电影一区二区| 午夜久久久久久| 国产亚洲福利社区一区| 92精品国产成人观看免费| 亚洲福中文字幕伊人影院| 日韩欧美国产电影| 99久久国产免费看| 卡一卡二国产精品| 亚洲宅男天堂在线观看无病毒| 欧美午夜电影在线播放| 捆绑紧缚一区二区三区视频 | 国产91精品露脸国语对白| 亚洲国产精品二十页| 色偷偷一区二区三区| 美女看a上一区| 午夜激情一区二区| 亚洲另类中文字| 亚洲天堂成人网| 亚洲欧美日韩久久| 久久久久久免费网| 日韩精品一区二区三区视频播放| 欧美色成人综合| 婷婷亚洲久悠悠色悠在线播放| 欧美视频精品在线观看| 3751色影院一区二区三区| 日韩欧美区一区二| 国产精品人妖ts系列视频| 亚洲伦在线观看| 久久精品国产亚洲a| 91欧美一区二区| 精品久久人人做人人爱| 中文字幕一区av| 极品美女销魂一区二区三区免费| 成人黄色大片在线观看| 欧美一区二区黄| 午夜视频一区二区| 成人高清视频在线| 精品日韩在线观看|