每隔N行生成一個彙總行(總結)
接前文
http://blog.itpub.net/29254281/viewspace-2149120/
http://blog.itpub.net/29254281/viewspace-2149309/
處理這種每隔N行生成一個彙總行的需求,一共有三種方式
為了簡單,就按照這個自然順序 ,每三行生成一個彙總行,sum前三行的值。
第一招,效率低下容易理解
結果:
第二招,數字輔助表補全. 效能較好. 計算彙總行,理解稍微複雜.
先增加一個數字輔助表 nums
初始化數字輔助表
call pFastCreateNums(100000);
然後
這個理解稍微有點複雜,
第二招改進版本
好理解多了,只是有冗餘行數。
第三招,又是王工的大招. 效能比第二招快15%-20%。可讀性強 好理解。整體還簡短。
http://blog.itpub.net/29254281/viewspace-2149120/
http://blog.itpub.net/29254281/viewspace-2149309/
處理這種每隔N行生成一個彙總行的需求,一共有三種方式
-
drop table t;
-
create table t (c int);
-
insert into t values
-
(15),(7),(9),(10),(7),(8),(20),(16),(9),(19),
-
(14),(10),(11),(10),(10),(12),(7),(10),(7),(9);
-
commit;
-
-
- select * from t;
為了簡單,就按照這個自然順序 ,每三行生成一個彙總行,sum前三行的值。
第一招,效率低下容易理解
- select case when c is null then '彙總' else '' end s,ifnull(c,sumc) c from (
- select ceil(id/3) l,c,null sumc
- from
- (
- select @id:=@id+1 id, t1.* from t t1,(select @id:=0) vars
- ) t2
- union all
- select ceil(id/3) l,null,sum(c)
- from
- (
- select @id1:=@id1+1 id, t1.* from t t1,(select @id1:=0) vars
- ) t3
- group by l
- ) t order by l,ifnull(c,'9999');
結果:
第二招,數字輔助表補全. 效能較好. 計算彙總行,理解稍微複雜.
先增加一個數字輔助表 nums
-
create table nums(id int not null primary key);
-
-
delimiter $$
-
create procedure pCreateNums(cnt int)
-
begin
-
declare s int default 1;
-
truncate table nums;
-
while s<=cnt do
-
insert into nums select s;
-
set s=s+1;
-
end while;
-
end $$
-
delimiter ;
-
-
delimiter $$
-
create procedure pFastCreateNums(cnt int)
-
begin
-
declare s int default 1;
-
truncate table nums;
-
insert into nums select s;
-
while s*2<=cnt do
-
insert into nums select id+s from nums;
-
set s=s*2;
-
end while;
-
end $$
- delimiter ;
初始化數字輔助表
call pFastCreateNums(100000);
然後
- select s,ifnull(c,cc) c
- from (
- select
- case when rn is null then '彙總' else '' end s,
- t4.c,
- if(mod(t3.id,4)!=0 ,case when @total=-1 then @total:=t4.c else @total:=@total+t4.c end,@total) cc,
- case when mod(t3.id,4)=0 then @total:=-1 else null end
- from (
- select * from nums where id<=
- (select (ceil(count(*)/4)+1)*5 from t )
- ) t3
- left join (
- select
- case when mod(@rn+1,4)=0 then @rn:=@rn+2 else @rn:=@rn+1 end rn ,
- t1.* from t t1,(select @rn:=0,@total:=0) vars
- ) t4 on(t3.id=t4.rn)
- ) result;
這個理解稍微有點複雜,
第二招改進版本
- select s,ifnull(c,cc) c
- from (
- select
- case when rn is null then '彙總' else '' end s,
- t4.c,
- case when t4.c is not null then @total:=@total+t4.c when t4.c is null then @total+(@total:=0) end cc
- from (
- select * from nums where id<=
- (select (ceil(count(*)/4)+1)*5 from t )
- ) t3
- left join (
- select
- case when mod(@rn+1,4)=0 then @rn:=@rn+2 else @rn:=@rn+1 end rn ,
- t1.* from t t1,(select @rn:=0,@total:=0) vars
- ) t4 on(t3.id=t4.rn)
- ) result where ifnull(c,cc) is not null;
好理解多了,只是有冗餘行數。
第三招,又是王工的大招. 效能比第二招快15%-20%。可讀性強 好理解。整體還簡短。
- select case when id is null then '彙總' else '' end s,sum(c) c from (
- select @id:=@id+1 id, t1.* from t t1,(select @id:=0) vars
- ) t2
- group by ceil(t2.id/3),t2.id with rollup;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-2149337/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 每隔15行生成一個彙總行(王工優化版)優化
- 多執行緒並行執行,然後彙總結果執行緒並行
- 【多執行緒總結(一)-基礎總結】執行緒
- 動態生成一個m行n列的表格
- java執行緒文章彙總Java執行緒
- 進行一個字串演算法的總結字串演算法
- JAVA 多執行緒總結(一)Java執行緒
- MYSQL執行緒池總結(一)MySql執行緒
- 執行及總結
- 易優CMS每隔N行輸出內容判斷
- Elasticsearch 一些命令彙總 以及學習總結Elasticsearch
- java多執行緒總結(系列一)Java執行緒
- 《一隻特立獨行的豬》總結
- Java執行緒總結Java執行緒
- 框架執行流程總結框架
- 自我總結行動方案
- 一SQL,每隔n個資料,取其中max,min值SQL
- hadoop配置、執行錯誤總結一Hadoop
- Socket Server的N種併發模型彙總Server模型
- Socket Server 的 N 種併發模型彙總Server模型
- 40 個 Java 多執行緒問題總結Java執行緒
- 40個Java多執行緒問題總結Java執行緒
- 在前端使用 JS 進行分類彙總前端JS
- Java 多執行緒面試問題彙總Java執行緒面試
- 檢視sql執行計劃方法彙總SQL
- 【多執行緒總結(四)-三大性質總結】執行緒
- 一個農民工混跡於 IT 行業多年後的泣血總結行業
- js執行環境總結JS
- iOS 多執行緒總結iOS執行緒
- 執行ps_5總結
- 執行ps2總結
- java多執行緒總結Java執行緒
- 執行緒併發總結執行緒
- 專案執行及總結
- Vagrant box 命令彙總彙總
- Java常見知識點彙總(⑬)——執行緒Java執行緒
- Java 多執行緒 - 總結概述Java執行緒
- MySQL 常用DDL執行方式總結MySql