(Les20 Analytics Functions)[20180108]

来源:https://www.cnblogs.com/also-brook/archive/2018/01/08/8242940.html
-Advertisement-
Play Games

學習目標 -瞭解分析函數作用和類型 -使用分析函數產生報告 分析函數 分析函數用於計算一些基於組的聚合值,它與聚合函數的區別在於,分析函數每組返回多行,聚合函數每組返回一行。 一般分析函數 ROW_NUMBER() OVER(PARTITION BY ... ORDER BY ...) 按分區或返回 ...


    學習目標         -瞭解分析函數作用和類型         -使用分析函數產生報告       分析函數         分析函數用於計算一些基於組的聚合值,它與聚合函數的區別在於,分析函數每組返回多行,聚合函數每組返回一行。       一般分析函數         ROW_NUMBER() OVER(PARTITION BY ... ORDER BY ...)  按分區或返回記錄生成唯一編號         RANK() OVER(PARTITION BY ... ORDER BY ...)  按分區或返回記錄排序,會跳號         DENSE_RANK() OVER(PARTITION BY ... ORDER BY ...)  按分區或返回記錄排序,不跳號         COUNT() OVER(PARTITION BY ... ORDER BY ...) 按分區或返回記錄進行計數         MAX() OVER(PARTITION BY ... ORDER BY ...) 按分區或返回記錄計算最大值          MIN() OVER(PARTITION BY ... ORDER BY ...) 按分區或返回記錄計算最小值           SUM() OVER(PARTITION BY ... ORDER BY ...) 按分區或返回記錄進行求和         AVG() OVER(PARTITION BY ... ORDER BY ...) 按分區或返回記錄求出平均值         FIRST_VALUE() OVER(PARTITION BY ... ORDER BY ...) 按分區或返回記錄的第一個值         LAST_VALUE() OVER(PARTITION BY ... ORDER BY ...) 按分區或返回記錄的最後一個值         LAG() OVER(PARTITION BY ... ORDER BY ...) 按分區或返回記錄上偏移值         LEAD() OVER(PARTITION BY ... ORDER BY ...) 按分區或返回記錄下偏移值           函數語法說明             PARITION BY                  Function_name(...) Over(partition by col_name)                 用於分區,按列進行分區             ORDER BY (預設視窗)                 Function_name(...) Over(Order by col_name [rows | range between n|unbounded preceding and n| unbounded following])                 -rows:【行】前n行、後n行或當前行,用於計算                 -range:【範圍】大於或小於當前值的n行,或使用前n行來計算                 -unbounded:【無界限】所有行都使用計算           ROW_NUMBER() OVER(partition by ... order by ...)                 功能與rownum偽列類似,order by子句中指定有序列,從1開始為分區中的每一行或查詢返回的每一行分配一個唯一的編號。                                  註意ROW_NUMBER(這裡不能限定列名)                 
查詢按部門代碼求出薪水排名:
13:49:52 SQL> set pagesize 500
13:50:09 SQL> col last_name format a20
13:50:09 SQL> select last_name,department_id,salary,row_number() over(partition by department_id order by salary ) row_num
13:50:09   2  from employees;
LAST_NAME            DEPARTMENT_ID     SALARY    ROW_NUM
-------------------- ------------- ---------- ----------
Whalen                          10       4390          1
Fay                             20       5990          1
Hartstein                       20      12990          2
Colmenares                      30       2490          1
Himuro                          30       2590          2
Tobias                          30       2790          3
Baida                           30       2890          4
Khoo                            30       3090          5
Raphaely                        30      10990          6
Mavris                          40       6490          1

 

            RANK()   OVER(PARTITION BY ... ORDER BY ...)                              為查詢返回的每一行併列排序,相同排名後的排名會出現跳號  
查詢部門代碼50,工資在3000~6000之間的排名情況
13:56:59 SQL> set pagesize 500
13:57:30 SQL> col last_name format a20
13:57:30 SQL> select last_name,department_id,salary,rank() over(partition by department_id order by salary ) row_num
13:57:30   2  from employees
13:57:30   3  where department_id =50
13:57:30   4  and salary between 3000 and 6000;
LAST_NAME            DEPARTMENT_ID     SALARY    ROW_NUM
-------------------- ------------- ---------- ----------
Fleaur                          50       3090          1
Walsh                           50       3090          1
Davies                          50       3090          1
Nayer                           50       3190          4--出現跳號
McCain                          50       3190          4
Taylor                          50       3190          4
Stiles                          50       3190          4
Bissot                          50       3290          8--出現跳號
Mallin                          50       3290          8
Dellinger                       50       3390         10--出現跳號
Rajs                            50       3490         11
Dilly                           50       3590         12
Ladwig                          50       3590         12
Chung                           50       3790         14--出現跳號
Everett                         50       3890         15
Bell                            50       3990         16
Bull                            50       4090         17
Sarchand                        50       4190         18
Mourgos                         50       5790         19
已選取 19 個資料列.

 

            DENSE_RANK() OVER(PARTITION BY ... ORDER BY ...)                 為查詢返回的每一行併列排序,相同排名後的排名不會跳號  
查詢部門代碼50,工資在3000~6000之間的排名情況
14:01:48 SQL> set pagesize 500
14:02:06 SQL> col last_name format a20
14:02:06 SQL> select last_name,department_id,salary,dense_rank() over(partition by department_id order by salary ) row_num
14:02:06   2  from employees
14:02:06   3  where department_id =50
14:02:06   4  and salary between 3000 and 6000;
LAST_NAME            DEPARTMENT_ID     SALARY    ROW_NUM
-------------------- ------------- ---------- ----------
Fleaur                          50       3090          1
Walsh                           50       3090          1
Davies                          50       3090          1
Nayer                           50       3190          2
McCain                          50       3190          2
Taylor                          50       3190          2
Stiles                          50       3190          2
Bissot                          50       3290          3
Mallin                          50       3290          3
Dellinger                       50       3390          4
Rajs                            50       3490          5
Dilly                           50       3590          6
Ladwig                          50       3590          6
Chung                           50       3790          7
Everett                         50       3890          8
Bell                            50       3990          9
Bull                            50       4090         10
Sarchand                        50       4190         11
Mourgos                         50       5790         12
已選取 19 個資料列.

 

            COUNT() OVER(PARTITION BY ... ORDER BY ...)                 返回查詢記錄或分區的計數值(次數)  
14:11:48 SQL> set pagesize 500
14:12:54 SQL> col last_name format a20
14:12:54 SQL> select last_name,department_id,salary,count(salary) over( partition by department_id ) count_num
14:12:54   2  from employees;
LAST_NAME            DEPARTMENT_ID     SALARY    COUNT_NUM
-------------------- ------------- ---------- ----------
Whalen                          10       4390          1--部門10中出現了1次
Hartstein                       20      12990          2--部門20中出現了2次
Fay                             20       5990          2--部門20中出現了2次
Raphaely                        30      10990          6--部門30中出現了6次
Khoo                            30       3090          6
Baida                           30       2890          6
Tobias                          30       2790          6
Himuro                          30       2590          6
Colmenares                      30       2490          6
Mavris                          40       6490          1
Weiss                           50       7990         45
Fripp                           50       8190         45
Kaufling                        50       7890         45
Vollman                         50       6490         45

 

            MAX() OVER(PARTITION BY ... ORDER BY ...)                 按分區返回最大的值  
14:12:55 SQL> set pagesize 500
14:15:59 SQL> col last_name format a20
14:15:59 SQL> select last_name,department_id,salary,max(salary) over( partition by department_id ) max_sal
14:15:59   2  from employees
14:15:59   3  ;
LAST_NAME            DEPARTMENT_ID     SALARY    MAX_SAL
-------------------- ------------- ---------- ----------
Whalen                          10       4390       4390--部門10薪水最高的
Hartstein                       20      12990      12990--部門20薪水最高的
Fay                             20       5990      12990--部門20薪水最高的
Raphaely                        30      10990      10990--部門30薪水最高的
Khoo                            30       3090      10990
Baida                           30       2890      10990
Tobias                          30       2790      10990
Himuro                          30       2590      10990
Colmenares                      30       2490      10990
Mavris                          40       6490       6490--部門40薪水最高的
Weiss                           50       7990       8190--部門50薪水最高的
Fripp                           50       8190       8190
Kaufling                        50       7890       8190
Vollman                         50       6490       8190
Mourgos                         50       5790       8190

 

            MIN() OVER(PARTITION BY ... ORDER BY ...)                 按分區返回最小的值  
14:16:00 SQL> set pagesize 500
14:18:10 SQL> col last_name format a20
14:18:10 SQL> select last_name,department_id,salary,min(salary) over( partition by department_id ) min_sal
14:18:10   2  from employees;
LAST_NAME            DEPARTMENT_ID     SALARY    MIN_SAL
-------------------- ------------- ---------- ----------
Whalen                          10       4390       4390
Hartstein                       20      12990       5990
Fay                             20       5990       5990
Raphaely                        30      10990       2490
Khoo                            30       3090       2490
Baida                           30       2890       2490
Tobias                          30       2790       2490
Himuro                          30       2590       2490
Colmenares                      30       2490       2490
Mavris                          40       6490       6490
Weiss                           50       7990       2090
Fripp                           50       8190       2090
Kaufling                        50       7890       2090
Vollman                         50       6490       2090
Mourgos                         50       5790       2090

 

            SUM() OVER(PARTITION BY ... ORDER BY ...)                 按分區彙總求和  
查詢所有薪水累積相加
14:32:10 SQL> set pagesize 500
14:32:40 SQL> col last_name format a20
14:32:40 SQL> select last_name,department_id,salary,sum(salary) over( order   by salary ) sum_sal
14:32:40   2  from employees
14:32:40   3  where department_id=30;
 
LAST_NAME            DEPARTMENT_ID     SALARY    SUM_SAL
-------------------- ------------- ---------- ----------
Colmenares                      30       2490       2490
Himuro                          30       2590       5080
Tobias                          30       2790       7870
Baida                           30       2890      10760
Khoo                            30       3090      13850
Raphaely                        30      10990      24840
已選取 6 個資料列.
                    
查詢按部門分區進行求和
14:19:28 SQL> set pagesize 500
14:20:06 SQL> col last_name format a20
14:20:06 SQL> select last_name,department_id,salary,sum(salary) over( partition by department_id ) sum_sal
14:20:06   2  from employees;
LAST_NAME            DEPARTMENT_ID     SALARY    SUM_SAL
-------------------- ------------- ---------- ----------
Whalen                          10       4390       4390
Hartstein                       20      12990      18980
Fay                             20       5990      18980
Raphaely                        30      10990      24840
Khoo                            30       3090      24840
Baida                           30       2890      24840
Tobias                          30       2790      24840
Himuro                          30       2590      24840
Colmenares                      30       2490      24840
Mavris                          40       6490       6490
Weiss                           50       7990     155950
Fripp                           50       8190     155950
Kaufling                        50       7890     155950
                
查詢按部門分區前後2筆進行求和 【視窗期】
14:24:33 SQL> set pagesize 500
14:24:59 SQL> col last_name format a20
14:24:59 SQL> select last_name,department_id,salary,sum(salary) over( partition by department_id order by salary rows between 2 preceding and 2 following ) sum_sal
14:24:59   2  from employees;
LAST_NAME            DEPARTMENT_ID     SALARY    SUM_SAL
-------------------- ------------- ---------- ----------
Whalen                          10       4390       4390 --部門只有1行
Fay                             20       5990      18980 
Hartstein                       20      12990      18980
Colmenares                      30       2490       7870--部門30,前後2行求和,7870=2490+2590+2790
Himuro                          30       2590      10760--部門30,前後2行求和,10760 =2490+2590+2790+2890
Tobias                          30       2790      13850--部門30,前後2行求和,13850 =2490+2590+2790+2890+3090
Baida                           30       2890      22350--部門30,前後2行求和,22350 =2590+2790+2890+3090+10990
Khoo                            30       3090      19760
Raphaely                        30      10990      16970
Mavris                          40       6490       6490
Olson                           50       2090       6470
Philtanker                      50       2190       8860
Markle                          50       2190      11250
Gee                             50       2390      11650
Landry                          50       2390      11950
Patel                           50       2490      12250
Vargas                          50       2490      12350
Marlow                          50       2490      12450
Perkins                         50       2490      12550
Sullivan                        50       2490      12650
OConnell                        50       2590      12750
 
範圍在200以內的【視窗期】
set pagesize 500
col last_name format a20
select last_name,department_id,salary,sum(salary) over( partition by department_id order by salary range between 200 preceding and 200 following ) sum_sal
from employees;
 
範圍無限制【視窗期】
set pagesize 500
col last_name format a20
select last_name,department_id,salary,sum(salary) over( partition by department_id order by salary range between unbounded preceding and unbounded following ) sum_sal
from employees;
 
set pagesize 500
col last_name format a20
select last_name,department_id,salary,sum(salary) over( partition by department_id order by salary rows between unbounded preceding and unbounded following ) sum_sal
from employees;

 

            AVG() OVER(PARTITION BY ... ORDER BY ...)                 按分區求出平均值             
14:39:56 SQL> set pagesize 500
14:39:56 SQL> col last_name format a20
14:39:56 SQL> select last_name,department_id,salary,avg(salary) over( partition by department_id ) avg_sal
14:39:56   2  from employees;
LAST_NAME            DEPARTMENT_ID     SALARY    AVG_SAL
-------------------- ------------- ---------- ----------
Whalen                          10       4390       4390
Hartstein                       20      12990       9490
Fay                             20       5990       9490
Raphaely                        30      10990       4140
Khoo                            30       3090       4140
Baida                           30       2890       4140
Tobias                          30       2790       4140
Himuro                          
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文主要介紹mysql 5.5在centos 6.5系統上的安裝步驟。 ...
  • 本文主要介紹資料庫Redis在CentOS 6.5和Mac上的安裝步驟。 ...
  • 首先明白一點並不是mysql禁止遠程連接,而是MYSQL的賬號禁止遠程連接。可能覺得我有點咬文嚼字了,不過我感覺分清這點還是很重要的。預設情況下,所有賬號都是禁止遠程連接的。在安裝MYSQL的時候,在設置ROOT密碼那裡有一個CHECKBOX,選中的話就開啟了ROOT的遠程登陸功能,預設是沒被選中的 ...
  • 概述 SQL Server Service Broker 用來創建用於交換消息的會話。消息在目標和發起方這兩個端點之間進行交換。消息用於傳輸數據和觸發消息收到時的處理過程。目標和發起方既可以在同一資料庫引擎實例的同一資料庫或不同資料庫中,也可以在不同資料庫引擎實例的同一資料庫或不同資料庫中。 每個 ...
  • 大數據簡介 大數據的概念 Volume(數據容量)、Variety(數據類型)、Viscosity(價值密度)、Velocity(速度)、Veracity(真實性) 大數據的性質 非結構性、不完備性、時效性、安全性、可靠性 大數據處理的全過程 數據採集與記錄 --> 數據抽取、清洗、標記 --> 數 ...
  • RHEL6+oracle11.2 無界面化命令安裝如下: 1.所需安裝軟體包檢查: yum install binutils-2.* compat-libcap1* compat-libstdc++-33-* gcc-4.* gcc-c++-4.* glibc-2.* glibc-devel-2.* ...
  • oracle 序列的創建與使用 (2012-03-15 16:14:09) 轉載 oracle 序列的創建與使用 轉載 在Oracle中,可以使用序列自動生成一個整數序列,主要用來自動為表中的數據類型的主鍵列提供有序的唯一值,這樣就可以避免在向表中添加數據時,手工指定主鍵值。而且使用手工指定主鍵值這 ...
  • 1.1 前言 在進行MySQL的優化之前必須要瞭解的就是MySQL的查詢過程,很多的查詢優化工作實際上就是遵循一些原則讓MySQL的優化器能夠按照預想的合理方式運行而已。更多關於MySQL查詢相關參照:http://www.cnblogs.com/clsn/p/8038964.html#_label ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...