起因
在公司很久了一直写的都出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 |