oracle 分析函式3

2022-08-11 05:27:10 字數 3018 閱讀 3032

top

/bottom n

first

/last

ntile

--①對所有客戶按訂單總額進行排名

--②按區域和客戶訂單總額進行排名

--③找出訂單總額排名前13位的客戶

--④找出訂單總額最高、最低的客戶

--⑤找出訂單總額排名前25%的客戶

--此處 null 被排到第一位 , 可以加 nulls last 把null的資料放到最後

select

region_id, customer_id,

sum(customer_sales) cust_sales,

sum(sum(customer_sales)) over(partition by

region_id) ran_total,

rank()

over(partition by region_id order

bysum(customer_sales) desc

/*nulls last

*/) rank

from

user_order

group

byregion_id, customer_id;

--找出所有訂單總額排名前3的大客戶

select

*from

(select

region_id,

customer_id,

sum(customer_sales) cust_total,

rank()

over(order

bysum(customer_sales) desc

nulls last) rank

from

user_order

group

byregion_id, customer_id)

where rank <=3;

--找出每個區域訂單總額排名前3的大客戶

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

bysum(customer_sales) desc

nulls last) rank

from

user_order

group

byregion_id, customer_id)

where rank <=3;

--min keep first last 找出訂單總額最高、最低的客戶

--min只能用於 dense_rank

--min 函式的作用是用於當存在多個first/last情況下保證返回唯一的記錄, 去掉會出錯

--keep的作用。告訴oracle只保留符合keep條件的記錄。

select

min(customer_id) keep (dense_rank first order

bysum(customer_sales) desc

) first,

min(customer_id) keep (dense_rank last order

bysum(customer_sales) desc

) last

from

user_order

group

bycustomer_id;

--出訂單總額排名前1/5的客戶 ntile

--1.將資料分成5塊

select

region_id,customer_id,

sum(customer_sales) sales,

ntile(

5) over(order

bysum(customer_sales) desc

nulls last) tile

from

user_order

group

byregion_id, customer_id;

--2.提取 tile=1 的資料

select

*from

(select

region_id,customer_id,

sum(customer_sales) sales,

ntile(

5) over(order

bysum(customer_sales) desc

nulls last) tile

from

user_order

group

byregion_id, customer_id)

where tile =1;

--cust_nbr,month 為主鍵, 去重,只留下month最大的記錄

--查詢 cust_nbr 相同, month 最大的記錄

select

cust_nbr,

max(month) keep(dense_rank first order

bymonth

desc

) max_month

from orders_tmp group

bycust_nbr;

--去重, cust_nbr,month 為主鍵, cust_nbr 相同,只留下month最大的記錄

delete

from orders_tmp2 where (cust_nbr, month) notin(

select

cust_nbr,

max(month) keep(dense_rank first order

bymonth

desc

) max_month

from orders_tmp2 tb group

by cust_nbr)

oracle分析函式

oracle分析函式 sql plus環境 1 group by子句 create test table and insert test data.create table students id number 15,0 area varchar2 10 stu type varchar2 2 sc...

Oracle 分析函式

分析函式提供了跨行,多層級聚合引用值的能力,並且可以在資料子集中控制排序粒度。與聚合函式不同,分析函式並不將結果集聚合較少的行。分析函式是在主查詢結果的基礎上進行一定的分析,如分部門彙總,分部門求均值等等。分析函式的模式 function arg1,arg2,arg3.argn over parti...

oracle 分析函式 排序值分析函式

一 問題描述 查詢列表時,我們有時需要對查詢結果依據某個字段進行排名。如果每條記錄在排序欄位上都不相同,我們可以將原查詢作為乙個檢視,查詢其rownum,便可以實現簡單排序,例如 但是,很多時候我們想用來排序的字段都是有重複值的,此時可能需要將值相同的記錄名詞並列,那麼我們就需要用到oracle的分...