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