首页 > 其他 > 详细

行转列计算差值的一种优化

时间:2014-12-31 02:19:18      阅读:334      评论:0      收藏:0      [点我收藏+]
http://blog.itpub.net/29254281/viewspace-1379159/

前文在计算差值的时候使用的是union all
先通过左连接计算两天签到人数的差值,然后union all当天签到的用户,最后行换列
但是这种方式的效率很低,需要扫描三次表.
(前文的数据和本文不一致,下面是本文使用的数据)
bubuko.com,布布扣
bubuko.com,布布扣

受到where in list的启发,使用如下方式,可以少扫描一次表.极大的提升了效率
where in list问题请参考:
http://blog.itpub.net/29254281/viewspace-1375383/


  1. select
  2.         type 类型,
  3.         sum(case when createtime=‘2014-12-15‘ then c else 0 end) 15签到,
  4.         sum(case when createtime=‘2014-12-16‘ then c else 0 end) 16签到,
  5.         sum(case when createtime=‘2014-12-17 then c else 0 end) 17签到,
  6.         sum(case when createtime=‘2014-12-18‘ then c else 0 end) 18签到,
  7.         sum(case when createtime=‘2014-12-19‘ then c else 0 end) 19签到,
  8.         sum(case when createtime=‘2014-12-20‘ then c else 0 end) 20签到,
  9.         sum(case when createtime=‘2014-12-21‘ then c else 0 end) 21签到
  10. from
  11. (
  12.         select c.createtime,
  13.         if(substring_index(substring_index(c.type,‘,‘,d.id),‘,‘,-1)=‘增量‘,c.incre,c.curr) c,
  14.         substring_index(substring_index(c.type,‘,‘,d.id),‘,‘,-1) type
  15.         from
  16.         (
  17.             select a.createtime,ifnull(a.c-b.c,0) incre, a.c curr,‘增量,当前‘ type from
  18.             (
  19.                 select
  20.                  date_format(createtime,‘%Y-%m-%d‘) createtime,
  21.                  count(*) c
  22.                 from award_chance_history
  23.                 group by
  24.                  date_format(createtime,‘%Y-%m-%d‘)
  25.             ) a
  26.             left join
  27.             (
  28.                 select
  29.                  date_format(createtime,‘%Y-%m-%d‘) createtime,
  30.                  count(*) c
  31.                 from award_chance_history
  32.                 group by
  33.                  date_format(createtime,‘%Y-%m-%d‘)
  34.             ) b on(a.createtime=b.createtime+ interval 1 day)
  35.         ) c,nums d
  36.         where d.id <= (length(c.type) - length(replace(c.type,‘,‘,‘‘))+1)
  37. ) a
  38. group by type
  39. order by case when type=‘当前‘ then 1 else 0 end desc;
其中nums是数字辅助表,请参考
http://blog.itpub.net/29254281/viewspace-1362897/

受到启发的内容
bubuko.com,布布扣

更进一步的优化,其实没有必要弄得那么复杂

  1. select
  2.         type "类型",
  3.         sum(case when createtime=‘2014-12-15‘ then c else 0 end) "15签到",
  4.         sum(case when createtime=‘2014-12-16‘ then c else 0 end) "16签到",
  5.         sum(case when createtime=‘2014-12-17‘ then c else 0 end) "17签到",
  6.         sum(case when createtime=‘2014-12-18‘ then c else 0 end) "18签到",
  7.         sum(case when createtime=‘2014-12-19‘ then c else 0 end) "19签到",
  8.         sum(case when createtime=‘2014-12-20‘ then c else 0 end) "20签到",
  9.         sum(case when createtime=‘2014-12-21‘ then c else 0 end) "21签到"
  10. from
  11. (
  12. select
  13.     c.createtime,
  14.     if(d.id=1,c.incre,c.curr) c,
  15.     if(d.id=1,‘增量‘,‘当前‘) type
  16. from
  17.     (select a.createtime,ifnull(a.c - b.c, 0) incre,a.c curr
  18.          from (select date_format(createtime, ‘%Y-%m-%d‘) createtime, count(*) c
  19.                           from award_chance_history
  20.                         group by date_format(createtime, ‘%Y-%m-%d‘)) a
  21.         left join (select date_format(createtime, ‘%Y-%m-%d‘) createtime, count(*) c
  22.                              from award_chance_history
  23.                             group by date_format(createtime, ‘%Y-%m-%d‘)) b
  24.         ON (a.createtime = b.createtime + interval 1 day)) c,
  25.     nums d
  26. where d.id <= 2) t
  27. group by type
  28. order by case when type=‘当前‘ then 1 else 0 end desc;
果真简单就是美.

行转列计算差值的一种优化

原文:http://blog.itpub.net/29254281/viewspace-1380980/

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!