我的编程空间,编程开发者的网络收藏夹
学习永远不晚

每隔15行生成一个汇总行

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

每隔15行生成一个汇总行

用户抽奖模块
award_gift_record 是用户抽奖记录表.
其中actiontime 是抽奖时间.
AwardGiftID表示中奖的礼物ID. -1表示没有中奖
awardactId 表示活动ID

需求:查询每分钟抽奖人数和中奖人数

  • 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);

    数字辅助表详见:
    http://blog.itpub.net/29254281/viewspace-1362897/

    思路就是用数字辅助表, 活动期间每分钟都生成一条记录.然后用左连接 匹配有抽奖中奖的记录

  • select if(mod(result.id,16)=0,'汇总','') 汇总,result.starttime,result.endtime,result.`中奖数量`,result.`抽奖数量` from (  
  • select   
  •     n.id,  
  •     when @starttime='' then @starttime:=starttime end ,  
  •     when mod(n.id,16)!=0 then @endtime:=endtime end,  
  •     if(mod(n.id,16)!=0 ,when @c1=-1 then @c1:=`中奖数量` else @c1:=@c1+`中奖数量` end,''),  
  •     if(mod(n.id,16)!=0 ,when @c2=-1 then @c2:=`抽奖数量` else @c2:=@c2+`抽奖数量` end,''),  
  •     when mod(n.id,16)=0 then @starttime else starttime end starttime,  
  •     when mod(n.id,16)=0 then @endtime else endtime end endtime,  
  •     when mod(n.id,16)=0 then @c1 else `中奖数量` end `中奖数量`,  
  •     when mod(n.id,16)=0 then @c2 else `抽奖数量`  end `抽奖数量`,  
  •     when mod(n.id,16)=0 then @starttime:='' else null end ,  
  •     when mod(n.id,16)=0 then @endtime:='' else null end ,  
  •     when mod(n.id,16)=0 then @c1:=-1 else null end ,  
  •     when mod(n.id,16)=0 then @c2:=-1 else null end   
  •       
  • from  
  •     nums n  
  •     join(  
  •         select t3.*,when mod(@rn+1,16)=0 then @rn:=@rn+2 else @rn:=@rn+1 end rn from (  
  •             select starttime,endtime,ifnull(`中奖数量`,0) `中奖数量`,ifnull(`抽奖数量`,0) `抽奖数量`  
  •             from (  
  •                 select   
  •                 id,  
  •                 '2017-12-21 09:30:00'+ interval (id-1) minute starttime,  
  •                 '2017-12-21 09:30:59'+ interval (id-1) minute endtime    
  •                 from nums,  
  •                 (select @rn:=0,@starttime:='',@endtime:='',@c1:=-1,@c2:=-1) vars   
  •                 where id<=10000   
  •                 AND   
  •                 ('2017-12-21 09:30:00'+ interval (id-1) minute)<=  
  •                 (select max(actiontime)+interval '15' minute   FROM award_gift_record WHERE awardactId=235)  
  •             ) t1  
  •             join   
  •             (  
  •                 SELECT   
  •                 date_format(actiontime,'%Y-%m-%d %H:%i:00') 时间,  
  •                 when AwardGiftID!=-1 then 1 else null end) 中奖数量,  
  •                 FROM award_gift_record   
  •                 WHERE awardactId=235   
  •                 group by date_format(actiontime,'%Y-%m-%d %H:%i:00')   
  •             ) t2 on(t2.时间 between t1.starttime and endtime)  
  •             group by starttime,endtime  
  •             order by starttime  
  •         ) t3   
  •     ) t4 on(n.id=t4.rn)  
  • where  
  •     n.id <= (  
  •         select   
  •             ceil(timestampdiff(MINUTE,  
  •                             min(actiontime),  
  •                             max(actiontime) + interval '15' minute) / 15 * 16) + 15  
  •         FROM  
  •             award_gift_record  
  •         WHERE  
  •             awardactId = 235)  
  • ) result;  



  • 这里最核心的是,每15行生成一行,然后用自定义变量填充生成行.

    在需求二的结果上 添加行号。这个行号每到 模16 就 加二。
    case when mod(@rn+1,16)=0 then @rn:=@rn+2 else @rn:=@rn+1 end rn

    这样行号会是这样
    ...
    14
    15
    17
    18

    中间把16 空过去.
    这样再用数字辅助表左连接这个结果。 就可以每15行多生成一行了。

    最后通过自定义变量的运算,填充生成的行即可。

    每隔15行生成一个汇总行



    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    每隔15行生成一个汇总行

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    vbs中每一行的最后一个字符转换成_的优点有哪些

    本篇内容介绍了“vbs中每一行的最后一个字符转换成_的优点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!保存为do.bat复制代码 代
    2023-06-08

    编程热搜

    目录