起因

在公司很久了一直写的都出crud和一些前端的代码,终于有个机会让我接触到了业务方面的需求

需求

想要计算一个股票组合的每日的涨跌幅

比如股票组合中有(a,b,c)四只股票

表中结构如下

代码 交易日 收盘价
a 20210603 10
a 20210602 11
a 20210601 12
b 20210603 20
b 20210602 22
b 20210601 24
c 20210603 15
c 20210602 14
c 20210601 10

单只股票的涨跌幅 = 今天收盘价 - 昨天收盘价 / 昨天收盘价 * 100%

股票组合涨跌幅 = SUM(单只股票的涨跌幅 * 权重)

解决方案

通过MySQL中的lead方法处理

SELECT
  代码,
  交易日,
  收盘价
  lead(收盘价,1) over (partition by 代码 order by 交易日 desc) as 前一日收盘价
from
table_name
order by 交易日 desc

这样就是将结果错一行

核心语句就是lead(收盘价,1) over (partition by 代码 order by 交易日 desc)

意为将下一行的收盘价代码来划分以交易日为降序来展示
得到的结果为

代码 交易日 收盘价 前一日收盘价
a 20210603 10 11
a 20210602 11 12
a 20210601 12
b 20210603 20 22
b 20210602 22 24
b 20210601 24
c 20210603 15 14
c 20210602 14 10
c 20210601 10