一個支持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%的數據