度量快速开发平台-专业、快速的软件定制快开平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 部件 流程 SQL
查看: 6022|回复: 12
打印 上一主题 下一主题

[分享] ORACLE 高级函数应用二

[复制链接]

542

主题

5916

帖子

1万

积分

作者

Rank: 7Rank: 7Rank: 7

积分
13589
跳转到指定楼层
楼主
发表于 2020-6-30 14:12:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
--二、分析函数
--over()开窗函数  按compid分组,按ttime排序,对记录的一个递增统计处理
SELECT COUNT(SUMMONEY) OVER(PARTITION BY COMPID ORDER BY TTIME) CNT_SAL,
   SUm(SUMMONEY) OVER(PARTITION BY COMPID ORDER BY TTIME) SUM_SAL,
   MAX(SUMMONEY) OVER(PARTITION BY COMPID ORDER BY TTIME) MAX_SAL,
   MIN(SUMMONEY) OVER(PARTITION BY COMPID ORDER BY TTIME) MIN_SAL,
   AVG(SUMMONEY) OVER(PARTITION BY COMPID ORDER BY TTIME) AVG_SAL
  FROM XTYWBILL WHERE COMPID IN ('2601','2602');
--1、rows,range改变窗口范围的函数:
--窗口范围为该分区的第一行和该分区的最后一行
--sum(summoney) over(partition by compid order by ttime
   -- rows between unbounded preceding and unbounded following) sum_1
--窗口范围为该分区内大于本记录ttime-365天,并且截止到当前记录的所有的金额累计
--sum(summoney) over(partition by compid order by ttime
   -- range 365/*value_expr*/ preceding) sum_2
--2、keep的用法
SELECT BILLID,VPD_COMPID,TTIME,ZJE,
   DENSE_RANK() OVER(PARTITION BY VPD_COMPID ORDER BY TTIME) DENSE_RANK,
   MIN(ZJE) KEEP(DENSE_RANK FIRST ORDER BY TTIME) OVER(PARTITION BY VPD_COMPID) MIN_FIRST,
   MIN(ZJE) KEEP(DENSE_RANK LAST ORDER BY TTIME) OVER(PARTITION BY VPD_COMPID) MIN_LAST,
   MAX(ZJE) KEEP(DENSE_RANK LAST ORDER BY TTIME) OVER(PARTITION BY VPD_COMPID) MAX_LAST
     FROM XTBILL2011;
--min(zje) dense_rank first order by ttime 是从时间最早的记录中找到最小的金额.
--max(zje) dense_rank last order by ttime 是从时间最晚的记录中找到最大的金额.
--注意:keep只能与dense_rank first\dense_rank last搭配使用.
--3、统计函数:
SELECT BILLID,VPD_COMPID,TTIME,ZJE,
   MIN(ZJE) OVER(PARTITION BY VPD_COMPID ORDER BY TTIME) AS COMP_MIN,
   MAX(ZJE) OVER(PARTITION BY VPD_COMPID ORDER BY TTIME) AS COMP_MAX,
   AVG(ZJE) OVER(PARTITION BY VPD_COMPID ORDER BY TTIME) AS COMP_AVG,
   SUM(ZJE) OVER(PARTITION BY VPD_COMPID ORDER BY TTIME) AS COMP_SUM,
   COUNT(*) OVER(PARTITION BY VPD_COMPID ORDER BY ZJE) AS COUNT_BY,
   COUNT(*) OVER(PARTITION BY VPD_COMPID ORDER BY ZJE RANGE BETWEEN 50 PRECEDING AND 150 FOLLOWING) AS BY_RANGE
  FROM XTBILL2011;
  
--4、排序函数:
--问:rank()\dense_rank()区别:
RANK()  DENSE_RANK()
1       1
1       1
3       2
--LOG(zje,1,0) --找到前面记录的值,1:表示找前一个的值,0:表示找不到 默认的值
--LEAD(zje,1,) --找到后面记录的值,1:表示找前一个的值,0:表示找不到 默认的值
--first_value() --取出该窗口的第一个值。
--last_value() --取该窗口最后一个值,注意是按渐进顺序来的,都是这样!
--null值排最后,作为最大值列
SELECT BILLID,VPD_COMPID,TTIME,ZJE,
   /*RANK() OVER(PARTITION BY VPD_COMPID ORDER BY ZJE) AS RANK,
   DENSE_RANK() OVER(PARTITION BY VPD_COMPID ORDER BY ZJE) AS DENSE_RANK,
   MIN(ZJE) KEEP(DENSE_RANK FIRST ORDER BY TTIME) OVER(PARTITION BY VPD_COMPID) WORST,
   MAX(ZJE) KEEP(DENSE_RANK LAST ORDER BY TTIME) OVER(PARTITION BY VPD_COMPID) BEST,
   LAG(ZJE,1,0) OVER(ORDER BY TTIME) AS PREV_ZJE,
   LEAD(ZJE,1,0) OVER(ORDER BY TTIME) AS NEXT_SAL,*/
   FIRST_VALUE(BILLID) OVER(PARTITION BY VPD_COMPID ORDER BY ZJE) AS FIRST_VALUE_ASC,
   FIRST_VALUE(BILLID) OVER(PARTITION BY VPD_COMPID ORDER BY NVL(ZJE,0) DESC) AS FIRST_VALUE_DESC,
   LAST_VALUE(BILLID) OVER(PARTITION BY VPD_COMPID ORDER BY NVL(ZJE,0)) AS LAST_VALUE_ASC,
   LAST_VALUE(BILLID) OVER(PARTITION BY VPD_COMPID ORDER BY ZJE DESC) AS LAST_VALUE_DESC,
   ROW_NUMBER() OVER(PARTITION BY VPD_COMPID ORDER BY BILLID) AS ROW_NUMBER
  FROM XTBILL2011 ORDER BY VPD_COMPID,ZJE DESC;
  
--5、ratio_to_report() 函数
--记录,所占的百分比
SELECT BILLID,VPD_COMPID,TTIME,ZJE,
   RATIO_TO_REPORT(ZJE) OVER()
  FROM XTBILL2011;
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

542

主题

5916

帖子

1万

积分

作者

Rank: 7Rank: 7Rank: 7

积分
13589
沙发
 楼主| 发表于 2020-6-30 14:15:06 | 只看该作者
回复 支持 反对

使用道具 举报

235

主题

2547

帖子

5834

积分

论坛元老

Rank: 8Rank: 8

积分
5834
板凳
发表于 2020-6-30 14:28:12 | 只看该作者
回复

使用道具 举报

141

主题

1551

帖子

3573

积分

论坛元老

Rank: 8Rank: 8

积分
3573
地板
发表于 2020-6-30 17:46:56 | 只看该作者

点评

朕纵观回复,为何没见诸君的阅后感???  详情 回复 发表于 2020-7-1 14:16
回复 支持 反对

使用道具 举报

542

主题

5916

帖子

1万

积分

作者

Rank: 7Rank: 7Rank: 7

积分
13589
5#
 楼主| 发表于 2020-7-1 14:16:11 | 只看该作者

朕纵观回复,为何没见诸君的阅后感???
回复 支持 反对

使用道具 举报

141

主题

1551

帖子

3573

积分

论坛元老

Rank: 8Rank: 8

积分
3573
6#
发表于 2020-7-1 14:44:42 | 只看该作者
回复 支持 反对

使用道具 举报

141

主题

1551

帖子

3573

积分

论坛元老

Rank: 8Rank: 8

积分
3573
7#
发表于 2020-7-4 18:17:26 | 只看该作者
回复 支持 反对

使用道具 举报

141

主题

1551

帖子

3573

积分

论坛元老

Rank: 8Rank: 8

积分
3573
8#
发表于 2020-7-7 17:44:05 | 只看该作者
回复 支持 反对

使用道具 举报

141

主题

1551

帖子

3573

积分

论坛元老

Rank: 8Rank: 8

积分
3573
9#
发表于 2020-7-8 17:44:29 | 只看该作者
回复 支持 反对

使用道具 举报

141

主题

1551

帖子

3573

积分

论坛元老

Rank: 8Rank: 8

积分
3573
10#
发表于 2020-7-8 17:45:18 | 只看该作者
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|重庆度量科技  本站关键词:快速开发平台

GMT+8, 2024-4-27 13:52 , Processed in 0.139251 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表