我有两个桌子
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。
答案 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
的测试