mysql中使用分析函式 開窗函式

2021-09-11 06:14:00 字數 2807 閱讀 4818

sql的分析函式用於複雜的統計方面非常好用,但mysql8之前不支援分析函式(開窗函式),怎麼辦呢?

我們可以利用變數來實現,先建立乙個表:

create table income_tl(

user_id int,

create_date date,

income int);

insert into income_tl values(1,'2016-03-01',100);

insert into income_tl values(1,'2016-03-02',300);

insert into income_tl values(1,'2016-03-03',200);

insert into income_tl values(1,'2016-03-04',500);

insert into income_tl values(1,'2016-03-05',500);

insert into income_tl values(2,'2016-03-01',200);

insert into income_tl values(2,'2016-03-01',300);

insert into income_tl values(2,'2016-03-03',300);

insert into income_tl values(2,'2016-03-04',500);

insert into income_tl values(2,'2016-03-05',400);

關於mysql的變數:

可以用set來定於變數,定義變數的形式是以」@」開始,如:」@變數名」。

mysql> set @t1=0, @t2=1, @t3=2;

mysql> select @t1,@t2, @t3;

+------++------++------+

| @t1 || @t2 || @t3 |

+------++------++------+

| 0 || 1 || 2 |

+------++------++------+

複雜一點的例項:

mysql> set @t1=0, @t2=1, @t3=2;

mysql> select @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;

+----------------------+------+------+------+

| @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 |

+----------------------+------+------+------+

| 5 | 5 | 1 | 4 |

+----------------------+------+------+------+

從上表要得到每個使用者每個月的總收入:

select it.user_id, 

it.create_date,

it.income,

case

when @preval = it.user_id then @curval := @curval + it.income

when @preval := it.user_id then @curval := it.income

end as sum_income

from income_tl it, (select @preval:=null, @curval:=null) r

order by it.user_id asc, it.create_date asc;

執行結果為:

說明:@preval和@curval為使用者變數,僅針對當前客戶端有效;

(select @preval:=null, @curval:=null) r 初始化@preval和@curval變數;

第二個when僅用作為@preval賦值,表示條件一直為true。(mysql中『』、0、null均為false);

= 只有在set和update時才是和:=一樣,賦值的作用,其它都是等於的作用;

:= 不只在set和update時時賦值的作用,在select也是賦值的作用;

再乙個例子:

乙個學習性任務:每個人有不同次數的成績,統計出每個人的最高成績。

這個問題相對還是簡單,用聚合函式就好了。

select id,name,max(score) from student group by id,name order by name
上邊這種情況只適用id 和name是一一對應的,否則查詢出來的資料是不正確的。

例如 : 1 張三 100

2 張三 90

查詢出來的結果

兩條資訊都會輸出。

避免這種情況,可以使用開窗函式。

個人理解就是,開窗函式和聚合函式功能是相反的。

聚合函式,將多行資料合併成一行資料;而開窗函式則是將一行資料拆分成多行。

開窗函式可以滿足上述問題,同時也可以滿足其他問題。例如:求每個班最高成績學生的資訊。

分析:每個人學號一定是不同的,名字可能有重名,最大複雜的情況是,每個班最高成績可能不止乙個。

如果繼續使用開始的方式,那麼是不能滿足要求的。

使用開窗函式就能很好的解決這個問題。

mysql中使用分析函式 開窗函式

眾說周知,oracle的分析函式用於複雜的統計方面非常好用,但mysql不支援oracle的分析函式 開窗函式 怎麼辦呢?我們可以通過另外的途徑來使用,直接貼上 create table income tl user id int,create date date,income int insert...

mysql開窗函式有哪些 mysql開窗函式

開窗函式 它可以理解為記錄集合,開窗函式也就是在滿足某種條件的記錄集合上執行的特殊函式。對於每條記錄都要在此視窗內執行函式,有的函式隨著記錄不同,視窗大小都是固定的,這種屬於靜態視窗 有的函式則相反,不同的記錄對應著不同的視窗,這種動態變化的視窗叫滑動視窗。開窗函式的本質還是聚合運算,只不過它更具靈...

mysql 開窗函式 累加 mysql實現開窗函式

學習過oracle的應該知道,oracle中的分析函式功能十分強大,包括mssql postgresql等資料庫都支援開窗函式。然而mysql至今都沒有提供這樣的功能,今天就來 下用mysql實現一些開窗功能需求。實驗資料 表sale month user id amount 201601 1 50...