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的分...