Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQL Join to the latest record

I want to join tables in such a way that it fetches only latest record from one of the tables:

The following are my data

Table_One:

+----+------+
| ID | Name |
+----+------+
|  1 | John |
|  2 | Tom  |
|  3 | Anna |
+----+------+

Table_two:

+----+----------+-----------+
| ID | Visit ID |   Date    |
+----+----------+-----------+
|  1 |     2513 | 5/5/2001  |
|  1 |    84654 | 10/5/2012 |
|  1 |      454 | 4/20/2018 |
|  2 |      754 | 4/5/1999  |
|  2 |      654 | 8/8/2010  |
|  2 |      624 | 4/9/1982  |
|  3 |     7546 | 7/3/1997  |
|  3 |   246574 | 6/4/2015  |
|  3 |    15487 | 3/4/2017  |
+----+----------+-----------+

Results needed after Join:

+----+------+----------+-----------+
| ID | Name | Visit ID |   Date    |
+----+------+----------+-----------+
|  1 | John |      454 | 4/20/2018 |
|  2 | Tom  |      654 | 8/8/2010  |
|  3 | Anna |   246574 | 6/4/2015  |
+----+------+----------+-----------+
like image 492
Bhargav Andipara Avatar asked Oct 15 '25 14:10

Bhargav Andipara


2 Answers

I suspect you have SQL Server if so, then you can use APPLY:

select o.*, tt.*
from Table_One o 
cross apply ( select top 1 t.VisitDate, t.Date
              from table_two t
              where t.id = o.id
              order by t.date desc
            ) tt;
like image 169
Yogesh Sharma Avatar answered Oct 17 '25 09:10

Yogesh Sharma


Different database engines have varying ways to get the top row from table 2 per group (you can google for "SQL windowing functions" and your product). Since you don't state what engine you're using it's impossible to give the most appropriate or most performant solution.

The following method should work in most or all SQL engines but will not be especially performant over a large data set (it will benefit from a composite index Table2(ID, Date)). The details of how you specify the aliases for the tables may differ a bit among engines but you can use this as a guide. A windowing function solution will probably be more efficient.

SELECT ID, Name, VisitID, Date
FROM Table1 AS T1
INNER JOIN Table2 AS T2 ON T1.ID = T2.ID 
WHERE NOT EXISTS (
   SELECT * FROM Table2 AS T2B WHERE T2B.ID = T1.ID AND T2B.Date > T2.Date)
like image 39
Larry Lustig Avatar answered Oct 17 '25 10:10

Larry Lustig



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!