今天宋三胖宋老师发了他们单位的一个需求原型.

他这个原型似乎是每两天,计算一个变化率. 数据都是示意的.
实际应该是如下图所示

第三行变化率
计算公式
(第一行 - 第二行) / 第一行
他们大数据,数据仓库的需求我也不是很明白.
实验数据准备.
-
CREATE TABLE `t` (
-
`k` varchar(20) NOT NULL,
-
`v1` float DEFAULT NULL,
-
`v2` float DEFAULT NULL,
-
PRIMARY KEY (`k`)
-
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-
INSERT INTO `t` (`k`,`v1`,`v2`) VALUES ('20160902',1.62,1.07);
-
INSERT INTO `t` (`k`,`v1`,`v2`) VALUES ('20160903',1.97,1.43);
-
INSERT INTO `t` (`k`,`v1`,`v2`) VALUES ('20160904',2.86,2.36);
-
INSERT INTO `t` (`k`,`v1`,`v2`) VALUES ('20160905',2.61,3.62);
-
INSERT INTO `t` (`k`,`v1`,`v2`) VALUES ('20160906',1.36,2.96);
-
INSERT INTO `t` (`k`,`v1`,`v2`) VALUES ('20160907',5.46,4.24);
-
INSERT INTO `t` (`k`,`v1`,`v2`) VALUES ('20160908',4.29,6.12);
-
INSERT INTO `t` (`k`,`v1`,`v2`) VALUES ('20160909',2.97,1.3);
-
INSERT INTO `t` (`k`,`v1`,`v2`) VALUES ('20160910',5.06,2.26);
-
INSERT INTO `t` (`k`,`v1`,`v2`) VALUES ('20160911',4.46,4.11);
创建数字辅助表
-
create table nums(id int not null primary key);
-
-
INSERT INTO `nums` (`id`) VALUES (1);
-
INSERT INTO `nums` (`id`) VALUES (2);
-
INSERT INTO `nums` (`id`) VALUES (3);
-
INSERT INTO `nums` (`id`) VALUES (4);
-
INSERT INTO `nums` (`id`) VALUES (5);
-
INSERT INTO `nums` (`id`) VALUES (6);
-
INSERT INTO `nums` (`id`) VALUES (7);
-
INSERT INTO `nums` (`id`) VALUES (8);
-
INSERT INTO `nums` (`id`) VALUES (9);
-
INSERT INTO `nums` (`id`) VALUES (10);
-
INSERT INTO `nums` (`id`) VALUES (11);
-
INSERT INTO `nums` (`id`) VALUES (12);
-
INSERT INTO `nums` (`id`) VALUES (13);
-
INSERT INTO `nums` (`id`) VALUES (14);
-
INSERT INTO `nums` (`id`) VALUES (15);
-
INSERT INTO `nums` (`id`) VALUES (16);
-
INSERT INTO `nums` (`id`) VALUES (17);
-
INSERT INTO `nums` (`id`) VALUES (18);
-
INSERT INTO `nums` (`id`) VALUES (19);
-
INSERT INTO `nums` (`id`) VALUES (20);
计算:

-
select
-
ifnull(k, '变化率') k,
-
ifnull(round(v1,4), @r1) r1,
-
ifnull(round(v2,4), @r2) r2,
-
@r1:=r1,
-
@r2:=r2
-
from(
-
select
-
a.*
-
from
-
nums n
-
left outer join (
-
select
-
t1.k,
-
t1.v1,
-
t1.v2,
-
round(@v1,4) as pv1,
-
round(@v2,4) as pv2,
-
round(@v1-v1/@v1,4) r1,
-
round(@v2-v2/@v2,4) r2,
-
@v1:=t1.v1 ,
-
@v2:=t1.v2 ,
-
@a:=@a + if(@a mod 3 = 0, 2, 1),
-
@a - 1 rn
-
from
-
(select @a:=0, @v1:=null, @v2:=null,@r1:=null,@r2:=null) var ,t t1
-
order by k
-
) a ON (n.id = a.rn)
-
WHERE
-
n.id <= @a
-
order by id
-
) f
-
;
变量@a 如果遇到需要计算的"第三行" 则加 2.
然后用数字辅助表外连接,这样 计算生成的行就出来了。
最后用自定义变量,把值填上.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29254281/viewspace-2127080/
,如需转载,请注明出处,否则将追究法律责任。