Mysql 选择相对于另一个表的最近日期

Mysql 选择相对于另一个表的最近日期,mysql,sql,Mysql,Sql,刚刚在语法上被难住了 mysql中有两个表&当满足以下条件时,我需要从表A中获取记录: 1) 表A中的名称与表B中的名称匹配 及 2) 表B中最近一天的价格低于表A中的记录 因此…在下面的示例表上运行查询将获取以下两条记录: 03-17-2019 Bob 8 03-20-2019 John 10 本质上,我需要评估表A中的每一行,检查表B中与表A中评估记录相关的最新日期的匹配名称,然后确定表A中的价格是否大于表B中最新匹配名称的价格。然后,我需要计算价格之间的差额。所以,在上

刚刚在语法上被难住了

mysql中有两个表&当满足以下条件时,我需要从表A中获取记录: 1) 表A中的名称与表B中的名称匹配 及 2) 表B中最近一天的价格低于表A中的记录

因此…在下面的示例表上运行查询将获取以下两条记录:

03-17-2019    Bob   8
03-20-2019    John  10
本质上,我需要评估表A中的每一行,检查表B中与表A中评估记录相关的最新日期的匹配名称,然后确定表A中的价格是否大于表B中最新匹配名称的价格。然后,我需要计算价格之间的差额。所以,在上面的两个记录中,差值是2和4

Table A
Date       | Name | Price
03-08-2019    Bob   6
03-25-2019    Bob   2
03-17-2019    Bob   8
03-20-2019    John  10

Table B
Date      | Name  |  Price
03-16-2019    Bob   4
03-28-2019    Bob   9
03-02-2019    Bob   12
03-10-2019    John  6

谢谢你的帮助

连接两个表,一次获取最小日期差,然后获取具有最小日期差的行:

select a.*
from tablea a 
inner join tableb b on b.name = a.name 
inner join (
  select a.name, min(abs(datediff(b.date, a.date))) mindatediff
  from tablea a inner join tableb b
  on b.name = a.name
  group by a.name           
) g on g.name = a.name and abs(datediff(b.date, a.date)) = g.mindatediff
请参阅。
或:

请参阅。
结果:


连接两个表,一次获取最小日期差,然后获取具有最小日期差的行:

select a.*
from tablea a 
inner join tableb b on b.name = a.name 
inner join (
  select a.name, min(abs(datediff(b.date, a.date))) mindatediff
  from tablea a inner join tableb b
  on b.name = a.name
  group by a.name           
) g on g.name = a.name and abs(datediff(b.date, a.date)) = g.mindatediff
请参阅。
或:

请参阅。
结果:


在MySQL 8+中,您将使用窗口函数

select ab.*, (price - b_price)
from (select a.*, b.price as b_price,
             row_number() over (partition by a.name order by datediff(b.date, a.date) as seqnum
      from a join
           b
           on a.name = b.name and
              a.date >= b.date
     ) ab
where seqnum = 1;

在MySQL 8+中,您将使用窗口函数

select ab.*, (price - b_price)
from (select a.*, b.price as b_price,
             row_number() over (partition by a.name order by datediff(b.date, a.date) as seqnum
      from a join
           b
           on a.name = b.name and
              a.date >= b.date
     ) ab
where seqnum = 1;