【SQL】窗口函數及其他進階用法

一個支持SQL online的在線編譯器😄
https://www.jdoodle.com/execute-sql-online/


定義

窗口函數:SQL語句中OVER子句,OVER()括號裏的內容就是窗口函數的作用域,窗口函數中的元素,常見的有三類:分區、排序、框架

1)分區
PARTITION BY COL1 [ORDER BY COL2]
2)排序
3)框架:是在一個分區內進行進一步限制的篩選器
FIRST_VALUE
LAST_VALUE

支持窗口函數的查詢元素:SELECT、ORDER BY

類別
1)排名:ROW_NUMBER( )、RANK( )、DENSE_RANK( )

2)分佈函數
PERCENT_RANK(百分位排名)、CUME_DIST(累計分佈)

3)偏移函數
FIRST_VALUE、LAST_VALUE

案例

表格如下:

create table SC(SId varchar(10),CId varchar(10),score decimal(18,1));
insert into SC values('01' , 'mat' , 80);
insert into SC values('01' , 'pai' , 90);
insert into SC values('01' , 'eng' , 99);
insert into SC values('02' , 'mat' , 70);
insert into SC values('02' , 'pai' , 60);
insert into SC values('02' , 'eng' , 80);
insert into SC values('03' , 'mat' , 80);
insert into SC values('03' , 'pai' , 80);
insert into SC values('03' , 'eng' , 80);
insert into SC values('04' , 'mat' , 50);
insert into SC values('04' , 'pai' , 30);
insert into SC values('04' , 'eng' , 20);
insert into SC values('05' , 'mat' , 76);
insert into SC values('05' , 'pai' , 87);
insert into SC values('06' , 'mat' , 31);
insert into SC values('06' , 'eng' , 34);
insert into SC values('07' , 'pai' , 89);
insert into SC values('07' , 'eng' , 98);

Output
在這裏插入圖片描述

1. 組內排序

  • RANK( )
    用法:最常用的方式,如果有兩個並列第一,那麼只有第三名,無第二名
    語法:rank() over(partition by 分類組別 order by 排序列 desc) rank
    可以把這個語句視爲新生成一個變量
select SId,CId,rank() 
	over(partition by CId order by score desc) rank 
	from SC;

Output
在這裏插入圖片描述

  • DENSE_RANK( )
    用法:如果有兩個並列第一,仍然有第二名
    語法:dense_rank() over(partition by 分類組別 order by 排序列 desc) rank
    可以把這個語句視爲新生成一個變量
select SId,CId,dense_rank() 
	over(partition by CId order by score desc) rank 
	from SC;

Output
在這裏插入圖片描述

  • ROW_NUMBER( )
    用法:不允許並列,如果有兩個並列第一,那麼其中一個是第一,另一個是第二
    語法:row_number() over(partition by 分類組別 order by 排序列 desc) rank
    可以把這個語句視爲新生成一個變量
select SId,CId,score,ROW_NUMBER() 
	over(partition by CId order by score desc) rank 
	from SC;

Output
在這裏插入圖片描述

2. 組內Top n, Bottom n

思路:就是組內排序外面再加一層查詢,easy!

  • 每組的top3
select new_SC.*,new_SC.rn 
	from (select SId,CId,score,row_number() 
		over(partition by CId order by score desc) rn 
		from SC) as new_SC 
	where new_SC.rn < 4 ;

Output
在這裏插入圖片描述

  • 每組的bottom3
select new_SC.*,new_SC.rn 
	from (select SId,CId,score,row_number() 
		over(partition by CId order by score asc) rn 
		from SC) as new_SC 
	where new_SC.rn < 4 ;

Output
在這裏插入圖片描述

3. 把組內不同行轉列

select SId, 
	max(case CId when 'eng' then score else 0 end) eng, 
	max(case CId when 'mat' then score else 0 end) mat,
	max(case CId when 'pai' then score else 0 end) pai 
	from SC 
	group by SId;

在這裏插入圖片描述

4. 隨機取數

從SC表格中隨機取出5個數

select * from SC order by Random() limit 5;

在這裏插入圖片描述

https://bbs.csdn.net/topics/392012376

隨機抽取n%的數據

5. 求衆數、中位數(組內)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章