I have a table of Cases with info like the following –
ID | CaseName | Date | Occupation |
---|---|---|---|
11 | John | 2020-01-01 | Joiner |
12 | Mark | 2019-10-10 | Mechanic |
And a table of Financial information like the following –
ID | CaseID | Date | Value |
---|---|---|---|
1 | 11 | 2020-01-01 | 1,000 |
2 | 11 | 2020-02-03 | 2,000 |
3 | 12 | 2019-10-10 | 3,000 |
4 | 12 | 2019-12-25 | 4,000 |
What I need to produce is a list of Cases including details of the most recent Financial value, for example –
ID | CaseName | Occupation | Lastest Value |
---|---|---|---|
11 | John | Joiner | 2,000 |
12 | Mark | Mechanic | 4,000 |
Now I can join my tables easy enough with –
SELECT * FROM Cases AS c LEFT JOIN Financial AS f ON f.CaseID = c.ID
And I can find the most recent date per case from the financial table with –
SELECT CaseID, MAX(Date) AS LastDate FROM Financial GROUP BY CaseID
But I am struggling to find a way to bring these two together to produce the required results as per the table set out above.
Advertisement
Answer
A simple method is window functions:
SELECT * FROM Cases c LEFT JOIN (SELECT f.*, MAX(date) OVER (PARTITION BY CaseId) as max_date FROM Financial f ) f ON f.CaseID = c.ID AND f.max_date = f.date;