千家信息网

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

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,/* 目录:1.语法2.常见函数及用法 2.1 排序函数 2.2 wm_concat()能实现不同行同字段的合并 !!!!生产环境慎用 2.3 开窗用法 2.4 占比函数ratio_to_r
千家信息网最后更新 2025年11月07日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 20150531group by 日期, 客户号;-----一段时间算累累计收益率  select  客户号,                         power(10,SUM(Log10(1 + NVL(日收益率, 0)))-1 累加收益率 from 客户收益表where 日期 between 20150101 and 20150531group by 客户号;
函数 收益 排序 客户 工资 部门 收益率 日期 数据 名字 员工 常见 股票 分析 强大 两个 代码 功能 场景 字段 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库分表怎么查历史数据 软件开发行业代码是什么 2核4g开我的世界服务器卡不卡 天津途致臻网络技术 互联网科技生态 小学网络安全周知识宣传 网络技术公司简介 静安区智能化软件开发概念设计 网络技术的发展和成熟 计算机网络技术实验指导书 服务器sql删除 东北大学数据库习题 运维可以做软件开发嘛 4h4g服务器能开多少主机 软件开发的系统思维方法 数据库登录密码错误被锁定 白鹭软件开发中心吃豆人游戏 上海掌赢网络技术有限公司 学习通数据库原理答案 阿里云轻量服务器怎么找安全组 计算机网络技术新手 网络安全教育登录平台 网络安全龙头股全 如何用数据库实现顾客档案搜索 第六次体育场地普查数据库 plc能建立自己的数据库吗 sql查看数据库是否被锁住 千万级数据文件导入数据库 软件开发过程中的几个阶段 数据库的完整性控制实验报告
0