ORACLE 分析函数

首先必须说明,这是别人的文章的个人阅读总结版本,对此非常感谢,因为感觉很棒,实际工作中已经帮助了我很多!


	|-统计方面
			|-公式
					|-Sum( ) Over ([Partition by  ] [Order by  ])
					|-Sum( ) Over ([Partition by  ] [Order by  ]  Rows Between   Preceding And   Following)
					|-Sum( ) Over ([Partition by  ] [Order by  ] Rows Between   Preceding And Current Row)
					|-Sum( ) Over ([Partition by  ] [Order by  ] Range Between Interval ' ' 'Day' Preceding And Interval ' ' 'Day' Following )
			|-例子
					|-
						--创建订单表
						CREATE TABLE order_record (
						    who VARCHAR2(30) NOT NULL,
						    whe VARCHAR2(100) NOT NULL,
						    yer NUMBER(4),
						    moh NUMBER(2),
						    total_oraders NUMBER(7),
						    total_sales NUMBER(11, 2)
						);
						
						SELECT all_sales.*, round(all_sales.sales/ all_sales.region_sales, 4)* 100 ||'%'
						FROM (
						    SELECT 
						    		o.whe, o.who, 
						    		SUM(o.total_sales) sales, 
						    		SUM(SUM(o.total_sales)) over(PARTITION BY whe) region_sales
						    FROM order_record o
						    GROUP BY whe, who
						) all_sales
						WHERE all_sales.sales> all_sales.region_sales* 0.5;


	|-排列方面
			|-公式
					|-Rank() Over ([Partition by  ] [Order by  ] [Nulls First/Last])
							|-相同数据排名一致,但下一记录会空出其中的排名
							|-数据	排名
								A			1
								B			2
								B			2
								C			4
					|-Dense_rank() Over ([Patition by  ] [Order by  ] [Nulls First/Last])
							|-相同数据排名一致,之后数据接上一次序继续
							|-数据	排名
								A			1
								B			2
								B			2
								C			3
					|-Row_number() Over ([Partitionby  ] [Order by  ] [Nulls First/Last])
							|-碰到相同数据时不做处理依照记录顺序依次递增
							|-数据	排名
								A			1
								B			2
								B			3
								C			4
					|-Ntile( ) Over ([Partition by  ] [Order by  ])
			|-例子
					|-
						SELECT  
						    region_id, customer_id, 
						    sum(customer_sales) total,
						    --按照地区内进行销售总额的排序
						    rank() over(PARTITION BY region_id ORDER BY SUM(customer_sales) desc) rank,	
						    dense_rank() over(PARTITION BY region_id ORDER BY SUM(customer_sales) desc) dense_rank,
						    row_number() over(PARTITION BY region_id ORDER BY SUM(customer_sales) desc) row_number
						FROM user_order
						GROUP BY region_id, customer_id;


	|-最大值/最小值查找方面
			|-公式
					|-Min( )/Max( ) Keep (Dense_rank First/Last [Partition by  ] [Order by  ])
					|-Ratio_to_report(value)
							|-Ratio_to_report(value)= value/ sum(value)
							|-函数允许我们计算每条记录在其对应记录集或其子集中所占的比例
			|-例子
					|-	--获取各地区订单排名前三的客户,其中空值放置于最后
						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;
						
						--查询订单最多和最少的信息
						SELECT  
								--MIN用于确保返回唯一记录
								--KEEP用于告知Oracle保留符合KEEP条件的记录
								--dense_rank为固定写法,不可更改
						       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;
						
						--查询订单总额排名前1/5的客户
						SELECT t.*
						FROM (
						    SELECT 
						    		region_id, customer_id, 
						    		--ntile中参数为5表示将按照条件将符合的记录分为5份,内容即为1...5
						    		ntile(5) over(ORDER BY SUM(customer_sales) DESC) til
						    FROM user_order
						    GROUP BY region_id, customer_id;
						)t
						WHERE t.til= 1;
						
						--统计当天和五天内的平均销售额
						SELECT
						       trunc(order_dt) DAY,
						       SUM(sale_price) daily_sales,
						       AVG(SUM(sale_price)) over (ORDER BY trunc(order_dt)
						          	 RANGE BETWEEN INTERVAL '2' DAY preceding 
						                 	AND INTERVAL '2' DAY following) five_day_avg
						from cust_order
						where sale_price IS NOT NULL
						      AND order_dt BETWEEN to_date('01-jul-2001','dd-mon-yyyy')
						          	AND to_date('31-jul-2001','dd-mon-yyyy')
						 
						 
						 --查询上、本、下个月的销售信息,并计算平均值
						 SELECT 
						    	MONTH,
							    first_value(SUM(tot_sales)) over (ORDER BY MONTH
							        	ROWS BETWEEN 1 preceding AND 1 following) prev_month,
							    SUM(tot_sales) monthly_sales,
							    last_value(SUM(tot_sales)) over (ORDER BY MONTH
							        	ROWS BETWEEN 1 preceding AND 1 following) next_month,
							    avg(sum(tot_sales)) over (ORDER BY MONTH
							       		ROWS BETWEEN 1 preceding AND 1 following) rolling_avg
						FROM orders
						WHERE YEAR= 2001 
						AND region_id = 6
						GROUP BY MONTH
						ORDER BY MONTH;
						 
						 
						 --查询本月和上月的销售额
						 SELECT   
						      MONTH ,            
						      SUM (tot_sales) monthly_sales,
						      lag(SUM (tot_sales), 1) over (ORDER BY MONTH) prev_month_sales
						FROM orders
						WHERE YEAR= 2001 AND region_id = 6
						GROUP BY MONTH
						ORDER BY MONTH ;



	|-首记录/末记录查找方面
			|-公式
					|-First_value / Last_value(Sum( ) Over ([Patition by  ] [Order by  ] Rows Between   Preceding And   Following  ))
			|-例子
					|-
						--窗口函数实现数据统计
						SELECT  
							  month,
							  SUM(tot_sales) month_sales,
							  --第一层SUM是用于group by的按月份合并,第二次则是对于指定的月份记录的数据合并 
							  SUM(SUM(tot_sales)) over (ORDER BY month	
					  				--unbounded preceding and unbouned following的意思针对当前所有记录的前一条、后一条记录,也就是表中的所有记录。
					  				--unbounded following
					  						--更改为current row即表示记录之前到现在的信息汇总,累计效果
					  						--更改为1 following则表示将下一条记录列入范围中
							  		ROWS BETWEEN unbounded preceding AND unbounded following) total_sales
						FROM orders
						GROUP BY month;


	|-相邻记录之间比较方面
			|-公式
					|-Lag(Sum( ), 1) Over([Patition by  ] [Order by  ])
			|-例子
					|-


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值