我有下表监控每天的价格,我想像今天的收盘价(前一天)一样在两天之间进行计算 的开盘价,例如周四的开盘价-周三的开盘价,所以我可以看到差异。
此外,周末没有记录,所以我该如何进行2次不同的计算, 例如1.周一休市-Sun返回相同的周一价格, 2.周一收盘价-周五前的开盘价
谢谢
size
理想的输出1:
width
输出2:
INSERT INTO goods(date,day,open,high,low,close,`range(daily high- low)`) VALUES
('2018-11-01','Thu',1.08430,1.08766,1.08175,1.08285,0.00591),
('2018-11-02','Fri',1.08319,1.08585,1.07988,1.07988,0.00597),
('2018-11-05','Mon',1.08258,1.08389,1.08011,1.08155,0.00378),
('2018-11-06','Tue',1.08160,1.08489,1.07461,1.07469,0.01028),
('2018-11-07','Wed',1.07543,1.07646,1.07094,1.07150,0.00552),
('2018-11-08','Thu',1.07148,1.07571,1.07083,1.07393,0.00488),
('2018-11-09','Fri',1.07409,1.07651,1.07124,1.07125,0.00527),
('2018-11-12','Mon',1.07190,1.07389,1.06759,1.06878,0.00630),
('2018-11-13','Tue',1.06830,1.06977,1.06609,1.06658,0.00368)
我正在使用php7.1,不确定mysql版本
答案 0 :(得分:2)
如果使用的是MySQL 8.0,则可以使用LAG()
来访问前一个按日期排序的记录。这将很乐意忽略几天之间的差距,因此周一收盘价将与周五开盘价进行比较:
SELECT
g.*,
g.close - LAG(g.open) OVER(ORDER BY g.date) price_diff
FROM goods g
对于较早版本的MySQL,通常会使用具有NOT EXISTS
条件的自联接和相关子查询来检索先前的记录:
SELECT g.*, g.close - g1.open price_diff
FROM goods g
LEFT JOIN goods g1
ON g1.date < g.date
AND NOT EXISTS (
SELECT 1 FROM goods g2 WHERE g2.date < g.date AND g2.date > g1.date
)
g
是当前记录(例如:今天)。 g1
代表昨天的记录:要识别它,我们指出RDBMS:
g1
的日期低于g
的日期g2
)的日期低于今天(g
)并高于昨天(g1
)这两个条件的组合使RDMS可以唯一标识相关记录(昨天的记录),然后可以将其值用于计算。