ITPub博客

首页 > 数据库 > MySQL > 隔两行生一行计算变化率

隔两行生一行计算变化率

原创 MySQL 作者:壹頁書 时间:2016-10-25 16:32:51 0 删除 编辑
今天宋三胖宋老师发了他们单位的一个需求原型.


他这个原型似乎是每两天,计算一个变化率. 数据都是示意的.

实际应该是如下图所示


第三行变化率
计算公式
    (第一行 - 第二行) / 第一行

他们大数据,数据仓库的需求我也不是很明白.

实验数据准备.
  1. CREATE TABLE `t` (  
  2.   `k` varchar(20) NOT NULL,  
  3.   `v1` float DEFAULT NULL,  
  4.   `v2` float DEFAULT NULL,  
  5.   PRIMARY KEY (`k`)  
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;  
  7. INSERT INTO `t` (`k`,`v1`,`v2`) VALUES ('20160902',1.62,1.07);  
  8. INSERT INTO `t` (`k`,`v1`,`v2`) VALUES ('20160903',1.97,1.43);  
  9. INSERT INTO `t` (`k`,`v1`,`v2`) VALUES ('20160904',2.86,2.36);  
  10. INSERT INTO `t` (`k`,`v1`,`v2`) VALUES ('20160905',2.61,3.62);  
  11. INSERT INTO `t` (`k`,`v1`,`v2`) VALUES ('20160906',1.36,2.96);  
  12. INSERT INTO `t` (`k`,`v1`,`v2`) VALUES ('20160907',5.46,4.24);  
  13. INSERT INTO `t` (`k`,`v1`,`v2`) VALUES ('20160908',4.29,6.12);  
  14. INSERT INTO `t` (`k`,`v1`,`v2`) VALUES ('20160909',2.97,1.3);  
  15. INSERT INTO `t` (`k`,`v1`,`v2`) VALUES ('20160910',5.06,2.26);  
  16. INSERT INTO `t` (`k`,`v1`,`v2`) VALUES ('20160911',4.46,4.11); 

创建数字辅助表
  1. create table nums(id int not null primary key);  
  2.   
  3. INSERT INTO `nums` (`id`) VALUES (1);  
  4. INSERT INTO `nums` (`id`) VALUES (2);  
  5. INSERT INTO `nums` (`id`) VALUES (3);  
  6. INSERT INTO `nums` (`id`) VALUES (4);  
  7. INSERT INTO `nums` (`id`) VALUES (5);  
  8. INSERT INTO `nums` (`id`) VALUES (6);  
  9. INSERT INTO `nums` (`id`) VALUES (7);  
  10. INSERT INTO `nums` (`id`) VALUES (8);  
  11. INSERT INTO `nums` (`id`) VALUES (9);  
  12. INSERT INTO `nums` (`id`) VALUES (10);  
  13. INSERT INTO `nums` (`id`) VALUES (11);  
  14. INSERT INTO `nums` (`id`) VALUES (12);  
  15. INSERT INTO `nums` (`id`) VALUES (13);  
  16. INSERT INTO `nums` (`id`) VALUES (14);  
  17. INSERT INTO `nums` (`id`) VALUES (15);  
  18. INSERT INTO `nums` (`id`) VALUES (16);  
  19. INSERT INTO `nums` (`id`) VALUES (17);  
  20. INSERT INTO `nums` (`id`) VALUES (18);  
  21. INSERT INTO `nums` (`id`) VALUES (19);  
  22. INSERT INTO `nums` (`id`) VALUES (20); 

计算:



  1. select   
  2.             ifnull(k, '变化率') k,  
  3.             ifnull(round(v1,4), @r1) r1,  
  4.             ifnull(round(v2,4), @r2) r2,  
  5.             @r1:=r1,  
  6.             @r2:=r2  
  7. from(  
  8.     select   
  9.         a.*  
  10.     from  
  11.         nums n  
  12.      left outer join    (  
  13.         select   
  14.             t1.k,  
  15.             t1.v1,  
  16.             t1.v2,  
  17.             round(@v1,4) as pv1,  
  18.             round(@v2,4) as pv2,  
  19.             round(@v1-v1/@v1,4) r1,  
  20.             round(@v2-v2/@v2,4) r2,  
  21.             @v1:=t1.v1 ,  
  22.             @v2:=t1.v2 ,  
  23.             @a:=@a + if(@a mod 3 = 0, 2, 1),  
  24.             @a - 1 rn  
  25.         from  
  26.             (select @a:=0, @v1:=null, @v2:=null,@r1:=null,@r2:=null) var ,t t1  
  27.         order by k   
  28.     ) a ON (n.id = a.rn)  
  29.     WHERE  
  30.         n.id <= @a  
  31.     order by id  
  32. ) f  
  33. ; 

变量@a 如果遇到需要计算的"第三行" 则加 2.
然后用数字辅助表外连接,这样 计算生成的行就出来了。
最后用自定义变量,把值填上.




来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29254281/viewspace-2127080/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 怎么理解Condition
请登录后发表评论 登录
全部评论

注册时间:2013-10-19

  • 博文量
    620
  • 访问量
    6339966