SQL Присоединиться к последней записи - PullRequest
0 голосов
/ 30 мая 2018

Я хочу объединить таблицы таким образом, чтобы он выбирал только последнюю запись из одной из таблиц:

Ниже приведены мои данные

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  |
+----+----------+-----------+

Результаты, необходимые после присоединения:

+----+------+----------+-----------+
| ID | Name | Visit ID |   Date    |
+----+------+----------+-----------+
|  1 | John |      454 | 4/20/2018 |
|  2 | Tom  |      654 | 8/8/2010  |
|  3 | Anna |   246574 | 6/4/2015  |
+----+------+----------+-----------+

Ответы [ 5 ]

0 голосов
/ 30 мая 2018

Я не на 100% уверен, что это правильно, поскольку идентификатор посещения может просто отбросить каждую запись прямо на вас.Однако вы можете найти отличную документацию здесь: https://www.w3resource.com/sql/aggregate-functions/max-date.php

select t1.ID,t1.Name,t2.visit_ID, Max(t2.Date) from Table_Two t2
inner join Table_One t1
on(t2.ID=t1.ID)
group by t1.ID,t1.Name,t2.visit_ID

что-то вроде этого должно работать, хотя, я думаю, что это тоже самое, что @Erwin Smout предлагает

select a.ID, t1.Name, a.date,t2.Visit_ID (
select ID, max(date)'date' from Table_Two 
group by ID) a
inner join Table_One t1
    on( a.ID=t1.ID)
inner join Table_Two t2
    on(a.ID=t2.ID and a.Date=t2.Date)
0 голосов
/ 30 мая 2018
SELECT ID,Name,Visit_ID,Date
FROM
    (SELECT *, ROW_NUMBER() OVER(PARTITION BY ID Date DESC) as seq
    FROM Table2 LEFT OUTER JOIN
         Table1 ON Table2.ID = Table1.ID) as mainTable
WHERE seq = 1
0 голосов
/ 30 мая 2018

Вы можете отфильтровать «последнее посещение», используя

ВЫБЕРИТЕ ID, МАКС. (ДАТА) ИЗ TABLE_TWO GROUP BY ID;

Затем вы присоедините его к TABLE_ONE (... ON .ID= .ID), чтобы выбрать столбец Имя, а затем снова присоединить его к TABLE_TWO (... ON ID = ID И ДАТА = ДАТА), если вам также нужно подобрать VISIT_ID.

Могут определенные СУБДимеют проприетарные / уникальные расширения, обычно служащие цели, позволяющие оптимизатору выполнять свою работу лучше (например, позволяя оптимизатору понять, что «присоединение обратно к TABLE_TWO может быть устранено). Думая здесь о SELECT TOP 1 ... и т. п.

0 голосов
/ 30 мая 2018

Я подозреваю, что у вас есть SQL Server , если это так, то вы можете использовать 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;
0 голосов
/ 30 мая 2018

Различные движки баз данных по-разному получают верхнюю строку из таблицы 2 для каждой группы (вы можете поискать «функции окон SQL» и ваш продукт в Google).Поскольку вы не указываете, какой движок вы используете, невозможно дать наиболее подходящее или наиболее производительное решение.

Следующий метод должен работать в большинстве или во всех движках SQL, но не будет особенно производительным при большихнабор данных (для него будет полезен составной индекс Table2 (идентификатор, дата)).Детали того, как вы указываете псевдонимы для таблиц, могут немного отличаться для разных движков, но вы можете использовать это как руководство.Решение оконной функции, вероятно, будет более эффективным.

 SELECT ID, Name, VisitID, Date FROM Table1 T1 INNER JOIN Table2 T2 +
   ON T1.ID = T2.ID 
   WHERE NOT EXISTS (SELECT * FROM Table2 T2B WHERE T2B.ID = T1.ID AND T2B.Date > T2.Date)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...