SQL选择2表中另一个日期的最接近的较小日期

时间:2019-02-15 10:03:21

标签: mysql

我有两个桌子

Table A
pk name   a_date
1  Peter  01-01-1991
2  Paul   02-01-1991
3  John   03-01-1991

Table B
pk  b_date
A   01-01-1991
B   02-01-1991

我想要的结果是:

name   a_date        b_date
Paul   02-01-1991    01-01-1991
John   03-01-1991    02-01-1991

为表A选择表B的最接近的较小日期

我试图在选择之前绘制结果

1  Peter  01-01-1991  A  01-01-1991
1  Peter  01-01-1991  B  02-01-1991
2  Paul   02-01-1991  A  01-01-1991
2  Paul   02-01-1991  B  02-01-1991
3  John   03-01-1991  A  01-01-1991
3  John   03-01-1991  B  02-01-1991

然后我尝试从a,date> b_date

的A,B中选择*

但是它会像这样返回:

2  Paul   02-01-1991  A  01-01-1991
3  John   03-01-1991  A  01-01-1991
3  John   03-01-1991  B  02-01-1991

我还尝试了一些类似子查询的方法: 其中a_date =(select ...); 但是我认为这是错误的方式。 那么我认为也许可以解决这个问题, 但是我发现在这种情况下我不能使用distinct。

2 个答案:

答案 0 :(得分:0)

这应该做到(假设日期存储为date而不是字符串):

SELECT a.name, a.date, MAX(b.date)
FROM a
JOIN b ON b.date < a.date
GROUP BY a.name, a.date

答案 1 :(得分:0)

在MySql 7.x中,您可以加入计算最近的子查询。

SELECT
a.*, 
b.pk as b_pk, 
b.b_date
FROM TableA a
INNER JOIN
(
    SELECT 
     a2.pk as a_pk, 
     MAX(b2.pk) AS b_pk
    FROM TableA a2
    JOIN TableB b2 ON b2.b_date < a2.a_date
    GROUP BY a2.pk
) q ON q.a_pk = a.pk
LEFT JOIN TableB b ON b.pk = q.b_pk

妊娠here

的测试

在MySql 8中,您可以为此使用窗口函数。

SELECT pk, name, a_date, b_pk, b_date
FROM 
(
    SELECT a.*, 
     b.pk AS b_pk,
     b.b_date,
     ROW_NUMBER() OVER (PARTITION BY a.pk ORDER BY b.b_date DESC) AS rn
    FROM TableA a
    JOIN TableB b ON b.b_date < a.a_date
) q
WHERE rn = 1

db-fiddle here

的测试