oracle 分析函数总结--仅供参考

/* 
目录:
1.语法
2.常见函数及用法
  2.1 排序函数
  2.2 wm_concat()能实现不同行同字段的合并 !!!!生产环境慎用
  2.3 开窗用法 
  2.4 占比函数ratio_to_report( ) over(partition by  )
  2.5 前一个lag 后一个 lead
  2.6 第一个first_value 最后一个last_value
  2.7 加1连乘再减1   
*/  
  
--1.分析函数的语法 :函数名() over (分区 排序 滑动窗口/开窗)
   --1.1.函数指定要在over圈定的数据上做什么操作,   
      --可以做sum(),max()等常见的聚合函数,   
      --也可以用row_number(),first_value()等功能强大的分析函数
   --1.2 分区 限定前面的函数操作的数据集是什么,类似于group by,但是功能比它强大
         用group by 时不做聚合的列就必须参与分组,不能单独显示出来。 
   --1.3 排序 指定函数计算的顺序,比如取排名,比如累加
   --1.4 开窗 partition by 的基础上指定参与计算的行
--2.常见的函数及用法
  --2.1 排序函数   
     row_number() 只返回一个结果  123456      
     rank()是跳跃排序,有两个第二名时接下来就是第四名122456
     dense_rank() 是连续排序,有两个第二名时仍然跟着第三名122345    
    【比如想获取每位员工在所在部门的排序】   
    select row_number() over (partition by deptno order by sal desc) no,  
           ename,   
           sal,  
           deptno from emp; 
        NO ENAME             SAL     DEPTNO
       ---------- ---------- ---------- ----------
        1 KING             5000         10
        2 CLARK            2450         10
        3 MILLER           1300         10
 
        1 SCOTT            3000         20
        2 FORD             3000         20
        3 JONES            2975         20
        4 ADAMS            1100         20
        5 SMITH             800         20
 
        1 BLAKE            2850         30
        2 ALLEN            1600         30
        3 TURNER           1500         30
        4 MARTIN           1250         30
        5 WARD             1250         30
        6 JAMES             950         30
   /*分区partition by 限定是按照部门作为一个数据集,这样就每个部门一个数据集
     row_number() 指明要在数据集合上做排序
     order by 指定按照sal排序 */

     --指定要每个部门的前3
      select *   
          from ( select t.deptno,  
                        t.ename,
                        t.sal,
                        row_number() over (partition by deptno 
                                           order by sal desc) top_no
                   from emp t
                 ) a
         where a.top_no<3;  
 
  --2.2 wm_concat()能实现不同行同字段的合并 !!!!生产环境慎用 
     /*场景:2.1已经能统计出每个部门的前3
     现在想将每个部门的前三按照:名字工资,名字工资,名字工资的格式合并为一列。*/
      select a.deptno,wm_concat(ename||sal)  
           ---切记虽然格式上有逗号,但是vm_concat会自动加逗号隔开
      from (
             select t.deptno,t.ename,t.sal,
                    row_number() over (partition by deptno 
                                       order by sal desc) top_no
             from emp t
           ) a
      where a.top_no<3      

    
  --2.3 开窗用法  向前preceding,向前5行 5 preceding ,向前所有unbounded preceding  
                  当前CURRENT ROW,  
                  向后following,向后5行 5 following,向后所有unbounded following   
     /*场景 stock_market表中记录 
    (d_date 日期,v_symbol 股票代码,vc_exchange 市场,f_price_close 收盘价) 
     现在要取每个股票的信息及3天均值 前后5天最高值 */ 
 SELECT t.d_date,
        t.vc_symbol,
        t.vc_exchange,
        t.f_price_close,
        --按照股票代码和市场进行分组 日期进行排序,当前行及向前2行进行avg 
        avg(t.f_price_close) over(PARTITION BY t.vc_symbol, t.vc_exchange      
                                  ORDER BY t.d_date   
                                  ROWS between 2 preceding and CURRENT ROW) avg_price,
        max(t.f_price_close) over(PARTITION BY t.vc_symbol, t.vc_exchange  
                                  ORDER BY t.d_date   
                                  ROWS between 5 preceding and 5  following) max_price
 FROM stock_market t 
 WHERE t.d_date between 20161123-5 and 20161123+5

 --2.4 占比函数ratio_to_report( ) over(partition by  )
  --计算员工工资占所在部门工资总和的百分之几。
   select ename,deptno,sal,ratio_to_report(sal) over(partition by deptno) from emp;
  --计算员工工资占所有工资总和的百分之几。
   select ename,deptno,sal,ratio_to_report(sal) over( ) from emp;

--2.5前1 lag 后1  lead
    select t.deptno,t.ename,t.sal,
           lag(sal) over(partition by deptno order by sal desc) d_pre,
           lead(sal) over(partition by deptno order by sal desc) d_flow
    from emp t
     
--2.6 第一个first_value 最后一个last_value
    select t.deptno, 
          t.ename, 
          t.sal,
          first_value(sal) over(partition by deptno   
                                 order by sal desc  
                                 rows between unbounded preceding and unbounded following                                )  as d_first,
          last_value(sal) over(partition by deptno  
                               order by sal desc  
                               rows between unbounded preceding and unbounded following                                 ) as d_last
     from emp t;
 
--2.7日常工作中在计算一段时间累加收益时,将每天的收益+1,然后进行连乘,最后再-1
 --每天算累加收益率      
select 日期,
       客户号,                 
       power(10,SUM(Sum(Log(10, (1 + NVL(日收益率, 0)))))
       OVER(partation by 客户号  
            ORDER BY t2.d_date  
            ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)) - 1   累加收益率 
from 客户收益表
where 日期 between 20150101 and 20150531
group by 日期, 客户号;

-----一段时间算累累计收益率
  select  客户号,                 
        power(10,SUM(Log10(1 + NVL(日收益率, 0)))-1 累加收益率
 from 客户收益表
where 日期 between 20150101 and 20150531
group by 客户号;
时间: 2024-07-29 13:22:44

oracle 分析函数总结--仅供参考的相关文章

Ubuntu 12.04 分区方案(仅供参考)

Ubuntu 12.04 分区方案(仅供参考) 总空间大小:50G 目录 建议大小 实际大小 格式 描述 / 10G~20G 10G ext4 根目录 swap <2048M 1G swap 交换空间 /boot 200M左右 100M ext4 Linux的内核及引导系统程序所需要的文件,比如 vmlinuz initrd.img文件都位于这个目录中.在一般情况下,GRUB或LILO系统引导管理器也位于这个目录:启动撞在文件存放位置,如kernels,initrd,grub. /tmp 5G左

四套写入方案(仅供参考)

四套写入方案 第一套:字节流读取写入方案 FileInputStream :字节流方式读取文本文件 FileOutputStream:字节流写入硬盘 第二套:字符流读取写入方案 FileReader:字符流读取文本 FileWriter:字符流写入文本 第三套: BufferedReader:自定义缓存大小 BufferedWriter:写入文本 一般和FileReader和FileWriter结合使用 第四套:可以读取二进制(img图片等 ) DataInputStream:将本地的img加载

信息与通信工程——重要国际学术会议和国际顶级期刊(仅供参考)

一.信息与通信工程的重要国际学术会议 主要包含两类: A类会议:本学科最顶尖级水平的国际会议: B类会议:学术水平较高.组织工作成熟.按一定时间间隔系列性召开的国际会议. A类会议(序号不表示优先顺序) 序号 / 英文名称 / 英文简称 / 中文名称 / 备注 1.IEEE International Conference on Acoustics, Speech and Signal Processing /  ICASAP /     IEEE 声学.语音和信号处理国际会议 2.IEEE I

Unity上一页下一页切换功能实现源码(仅供参考)

在做项目时我们有时需要实现切换上一页下一页图片,切换上一首下一首歌曲等等类似的功能.这里写了个简单的实现源码(仅供参考),要是有更好的方法欢迎提出来,共同进步~ 以切换上一页下一页图片为例: using UnityEngine; using System.Collections; using UnityEngine.UI; public class PanoramaManager : MonoBehaviour { //图片存放数组 Texture2D[] arr; //下一张按钮计数索引 in

开发问题---数据库字段前出现“—”(保存留用,仅供参考)

开发时数据调用往往会用到占位符,然而刚开始使用很容易碰见sql语句在SQLServer中查询时显示"-",如下代码: #region 先判断是否有记录,再确定使用哪条命令 //查询数据库 20140713 commandText = "use zzbjcdzz select *" + "from [T_VillageBasicInfo] " + "where ltrim(rtrim([code]))='{0}' "; //注意

Django开发的简单CMDB系统(仅供参考)

自己基于django开发的一个简单机房机柜CMDB系统,仅供参考.欢迎在下面留言,提出修改意见. 可实现增删改查. 权限未做,很多功能都没做,只做一个最基本的,初学. 前端模板用的inspinia2.5,和jumpserver用的一样的模块,所以看着差不多.模板可自行百度搜索. 放到pycharm或者linux环境下,配置好,运行就可以. domo 登录:http://42.62.6.54:8001/index.html  ,默认用户名hequan,密码123456. 下载链接:http://p

如何有效防止DEDE织梦系统被挂木马安全设置(仅供参考)

尊敬的客户,您好!     感谢广大客户对我司工作的信任和支持!      我司在最近的一个多月内陆续发现多起因 DedeCMS 安全漏洞造成网站被上传恶意脚本的事件,入侵者可利用恶意脚本对外发送大量数据包,严重占用CPU资源与服务器带宽,影响极为恶劣.为保证服务稳定,即日起一旦发现网站存在此类恶意脚本,我们将立即暂停该网站的服务直到问题修复.如果您正在使用 DedeCMS,请立即检查是否已经存在恶意脚本,并更新程序到最新版本或应用相关补丁.     迄今为止,我们发现的恶意脚本文件有    

mysql 千万级数据查询效率实践,分析 mysql查询优化实践--本文只做了一部分,仅供参考

数据量, 1300万的表加上112万的表 注意: 本文只做了部分优化,并不全面,仅供参考, 欢迎指点. 请移步tim查看,因为写的时候在tim写的,粘贴过来截图有问题,就直接上链接了. https://823948977.docs.qq.com/T5e6dBYLoZz?opendocxfrom=tim 文章内容类似截图:

单相变频电源的功能特点--深圳市中港扬盛仅供参考

变频电源的种类分为单相和三相变频,其在电压及功率上都有不同的作用和特点.今天大家分享的是关于中港扬盛的单相变频电源的一些特点: 1.能够有效的抗干扰作用:比如通过Y/△接线的隔离后,就能够阻止一部分谐波的传输:2.能够阻抗变换作用:主要是增加系统阻抗,这样就能使保护装置等容易配合:3.能够稳定系统电压的作用:比如像在启动大负荷设备的时候,能够减少启动时大电流对系统电压的影响:4.能够防止系统接地的作用:当隔离负荷侧发生单相接地时,不会造成整个系统单相接地:5.能够降低短路电流:当负荷侧发生短路事