Reputation: 21
In SQL Server I have 2 tables
table_a
card_number reissue_date
1 15.02.2017 00:00:00
2 01.02.2017 00:00:00
3 01.01.2017 00:00:00
table_b
card_number timestamp limit
1 01.01.2017 00:00:00 9999
1 01.02.2017 00:00:00 100000
1 01.03.2017 00:00:00 25000
2 01.01.2017 00:00:00 10001
3 01.03.2017 00:00:00 5000
3 01.04.2017 00:00:00 0
Expected Result
card_number limit
1 100000
2 10001
I tried many options in this, I came close to a solution, but I could not display the column "limit", what is the best way to solve this problem?
My wrong decision
SELECT table_b.card_number, Max(timestamp)
FROM table_b LEFT JOIN table_a
ON ( table_b.card_number = table_a.card_number
AND table_b.timestamp < table_a.reissue_date )
WHERE table_a.reissue_date IS NOT NULL
GROUP BY table_b.card_number;
It is necessary to make a selection of the latest by date records of the table_b table, but not larger than the date in table_a
The working solution I came to at the moment, I'm not sure if it works correctly, but with my initial data it gave the desired result
SELECT card_number,
Max(timestamp),
Max(limit) AS timestamp
FROM table_b
WHERE table_b.timestamp < (SELECT reissue_date
FROM table_a
WHERE card_number = table_b.card_number)
GROUP BY card_number;
Upvotes: 0
Views: 159
Reputation: 222442
In SQL Server, we can use a row-limiting lateral join to bring the latest record in the second table prior to the timestamp of the first table:
select a.card_number, b.*
from table_a a
cross apply (
select top (1) b.*
from table_b b
where b.card_number = a.card_number and b.timestamp < a.reissue_date
order by b.timestamp desc
) b
This also eliminates rows that have no match, which is consistent with your data.
Upvotes: 1