每隔15行生成一個彙總行(王工優化版)

壹頁書發表於2017-12-26
http://blog.itpub.net/29254281/viewspace-2149120/
接前文

前文有一塊寫多餘了
糾正如下


王工優化的版本如下,確實是效率又高,可讀性又好,整體還更精煉.
  1. select   
  2.     case  
  3.         when starttime is null then '彙總'  
  4.     else ''  
  5.     end l,  
  6.     ifnull(starttime, minstarttime) starttime,  
  7.     ifnull(endtime, maxendtime) endtime,  
  8.     `中獎數量`,`抽獎數量`  
  9. from(  
  10.             select   
  11.             ceil(t1.id/15) l,  
  12.             starttime,  
  13.             endtime,  
  14.             sum(ifnull(`中獎數量`,0)) `中獎數量`,  
  15.             sum(ifnull(`抽獎數量`,0)) `抽獎數量`,  
  16.             min(starttime) minstarttime,  
  17.             max(endtime) maxendtime  
  18.             from (    
  19.                 select     
  20.                 id,    
  21.                 '2017-12-21 09:30:00'+ interval (id-1) minute starttime,    
  22.                 '2017-12-21 09:30:59'+ interval (id-1) minute endtime      
  23.                 from nums,    
  24.                 (select @rn:=0,@starttime:='',@endtime:='',@c1:=-1,@c2:=-1) vars     
  25.                 where id<=10000     
  26.                 AND     
  27.                 ('2017-12-21 09:30:00'+ interval (id-1) minute)<=    
  28.                 (select max(actiontime)+interval '15' minute   FROM award_gift_record WHERE awardactId=235)    
  29.             ) t1    
  30.             left join     
  31.             (    
  32.                 SELECT     
  33.                 date_format(actiontime,'%Y-%m-%d %H:%i:00') 時間,    
  34.                 count(case when AwardGiftID!=-1 then 1 else null end) 中獎數量,    
  35.                 count(AwardGiftID) 抽獎數量     
  36.                 FROM award_gift_record     
  37.                 WHERE awardactId=235     
  38.                 group by date_format(actiontime,'%Y-%m-%d %H:%i:00')     
  39.             ) t2 on(t2.時間 between t1.starttime and endtime)    
  40.             group by l,starttime,endtime   with rollup having   
  41.             (  
  42.                 (endtime is   null and  starttime is   null)   
  43.                 or  
  44.                 (starttime is not null and endtime is not null)  
  45.             )  
  46. ) result;  

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-2149309/,如需轉載,請註明出處,否則將追究法律責任。

相關文章