MySQL查询将值与前一行的值进行比较

MySQL查询将值与前一行的值进行比较,mysql,row,lag,Mysql,Row,Lag,我一直在搜索,但一直无法找到解决方案-我知道这是可以做到的,但我只是还没有我需要的忍者SQL技能 我正在寻找解决这个问题的方法:我有两个与股市数据相关的表。第一个是一个简单的股票符号列表,带有ID和股票代码ID,symbol。第二个表包含每种股票的历史价格数据。ID、日期、打开、高、低、关闭、卷 我试图找出如何查询最近收盘价高于5个交易日前收盘价的股票。我不能只做日期计算,因为股票不是每天都在交易,周末和节假日不交易,还有一些股票可能在正常交易日不交易。因此,我只需要比较每个符号最近一行和第五行

我一直在搜索,但一直无法找到解决方案-我知道这是可以做到的,但我只是还没有我需要的忍者SQL技能

我正在寻找解决这个问题的方法:我有两个与股市数据相关的表。第一个是一个简单的股票符号列表,带有ID和股票代码ID,symbol。第二个表包含每种股票的历史价格数据。ID、日期、打开、高、低、关闭、卷

我试图找出如何查询最近收盘价高于5个交易日前收盘价的股票。我不能只做日期计算,因为股票不是每天都在交易,周末和节假日不交易,还有一些股票可能在正常交易日不交易。因此,我只需要比较每个符号最近一行和第五行的收盘价

我这里有示例表和数据:

查询的伪代码如下所示: 查找最近收盘价高于5个交易日前收盘价的符号

我要创建的查询应产生以下结果:

Date        Symbol   Close   Close(-5)
2014-11-06  AA       16.37   16.22
2014-11-06  ADT      36.07   35.19
2014-11-06  AEO      13.82   12.86

符号“AFA”不匹配,因为它最近的收盘价是24.55,比24.75早5行

您可以使用相关子查询在5天前获得价格。事实上,你可以用同样的方法得到最近的价格。因此,这可能是正确的路径:

  select s.*,
         (select p.close
          from prices p
          where p.id = s.id
          order by date desc
          limit 1
         ) as Close,
         (select p.close
          from prices p
          where p.id = s.id and p.date <= date(now()) - interval 5 day
          order by date desc
          limit 1
         ) as Close_5
  from stocks s
  having Close > Close_5;

所以你想找出a是每只股票的最新价格,但b只保留那些价格高于5天前的股票?但是如果5天之后没有价格怎么办!?!既然符号是唯一的,而且可能是不变的,为什么要存储id而不是符号呢!?!我想我理解为什么ADT和AEO会出现在结果中,但不是对你的第一个问题。。。我最初的描述可能不够清楚。我想抓住那些价格高于5个交易日前的人,而不是5个日历日前的人。交易日仅定义为价格表中前5行。符号名称偶尔会更改,因此会存储一个id。戈登-谢谢你的回答。不幸的是,基于日期的抵销并不能在所有情况下都起作用,因为有些日子,如周末和节假日,不是交易日。子查询需要选择最近的第五个收盘价,这也是让我困惑的部分:@paul我想你应该修改你的问题accordingly@Paul . . . “我认为你应该问另一个问题,更清楚地说明你在约会方面面临的问题。”来源:戈登林诺夫。问题它说日期数学不起作用,因为日期有间隔。所以我想说这不是约会的问题。由于我无法理解这一点,也许我问的问题不对;有没有关于如何让这一点更清楚的建议?试图把它归结起来。。。我需要选择股票符号,其中最近收盘价大于收盘价5行,然后按日期对行进行排序,但每行中的日期不是连续的天,日期中存在间隔。非常感谢您提供有关如何使问题更清楚的指导,谢谢!:
  select s.*,
         (select p.close
          from prices p
          where p.id = s.id
          order by date desc
          limit 1
         ) as Close,
         (select p.close
          from prices p
          where p.id = s.id and p.date <= date(now()) - interval 5 day
          order by date desc
          limit 1
         ) as Close_5
  from stocks s
  having Close > Close_5;