如何计算来自不同行的数据

时间:2019-02-11 01:32:36

标签: mysql sql database

我有下表监控每天的价格,我想像今天的收盘价(前一天)一样在两天之间进行计算 的开盘价,例如周四的开盘价-周三的开盘价,所以我可以看到差异。

此外,周末没有记录,所以我该如何进行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版本

1 个答案:

答案 0 :(得分:2)

如果使用的是MySQL 8.0,则可以使用LAG()来访问前一个按日期排序的记录。这将很乐意忽略几天之间的差距,因此周一收盘价将与周五开盘价进行比较:

SELECT
    g.*,
    g.close - LAG(g.open) OVER(ORDER BY g.date) price_diff
FROM goods g

Demo on DB Fiddle


对于较早版本的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可以唯一标识相关记录(昨天的记录),然后可以将其值用于计算。

Demo on DB Fiddle