mysql如何实现两行记录相减

需求是需要统计某只股票的某个时间段的区间涨幅,表结构如下:

CREATE TABLE `money` (
  `id` int(11) NOT NULL,
  `code` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL,
  `name` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,
  `pchange` double NOT NULL,
  `inflow` double NOT NULL,
  `amount` bigint(11) NOT NULL,
  `price` double NOT NULL,
  `high` double NOT NULL,
  `low` double NOT NULL,
  `open` double NOT NULL COMMENT '开盘',
  `yclose` double NOT NULL COMMENT '收盘',
  `amplitude` double NOT NULL COMMENT '振幅',
  `dchratio` double NOT NULL COMMENT '换手率',
  `datetime` int(11) NOT NULL,
  `type` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

我的思路是先找出时间段的数据(order by datetime),然后通过(最后一条记录的price - 首条记录的price)/ 首条记录的price *100

但不知道怎么实现,希望有人能提供 一个方法。

当然,有更好的思路就更好了,我也担心性能有问题

2个回答

定义3个变量:time1,time2,result 。
可以封装成一个方法或存储过程,2个时间点为参数

declare @time1 datetime,@time2 datetime,@result decimal(8,3)

select @result = 100 * ((select price from money where datetime =@time2)-(select price from money where datetime = @time1))/(select price from money where datetime=@time1)

weixin_41262940
weixin_41262940 回复wggwfnh: 我用SQL SERVER 试过可行。你先试一下不封装成过程能否得到正确的值。
10 个月之前 回复
wggwfnh
wggwfnh 谢谢你的方法,我封装成过程,定义如下:CREATE PROCEDURE getRealPChange( IN startTime INT(11), in endTime INT(11), OUT result DECIMAL(8, 3) ) ,但是@result返回的是null?
10 个月之前 回复

这还需要写存储过程嘛...你set三个变量就行了,第一个变量是开始时间,第二个结束时间,第三个就是哪支股票。

set @start_time = date'开始时间';
set @end_time = date'结束时间';
set @flag = '股票的标志';
select (sum(a.end_price )- sum(a.start_price)) / sum(a.end_price) * 100
from
(select case when datetime = @start_time then price else 0 end start_price,
                    case when datetime = @end_time then price else 0 end end_price
                    from table_name where 股票的标志字段 = @flag) a;

代码里的datetime变成时间类型就OK了,我看你题目里给的好像是整形。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问