Как получить самый новый адрес для каждого человека - PullRequest
1 голос
/ 23 мая 2019

Я создал простую базу данных Access на примере структуры таблицы и запроса.Две таблицы: человек (содержит 3 записи) и адрес (содержит 5 записей), обеспечивают возможность захвата нескольких адресов для каждого человека.У меня все хорошо с обычными условными выражениями, но этот бросает меня в тупик ... Я ищу запрос, который вернет только самый новый адрес для данного человека. Таблица отношений

Текущий sql для запроса:

SELECT Person.PersonID_PK, Address.Address, Address.StatusDate
FROM Person INNER JOIN Address ON Person.[PersonID_PK] = Address.PersonID_FK;

Мой текущий доход:

EmployeeID_PK  Address                         StatusDate
1               12 Elm St, MN  23569            11/13/2017
1               15 Apple Ln, NY 12345           7/15/2018
2               30 Mulberry, TN 38456           6/11/2018
2               10 Lonesome Pine, KY 15487      12/4/2018
3               100 Plaze Place, LA 14563       6/17/2018  

Мне нужно вернуть каждого человека вместе снаибольший (новейший) StatusDate мое ожидаемое возвращение должно быть:

EmployeeID_PK  Address                             StatusDate
1               15 Apple Ln, NY 12345                7/15/2018
2               10 Lonesome Pine, KY 15487           12/4/2018
3               100 Plaze Place, LA 14563            6/17/2018

Ответы [ 3 ]

3 голосов
/ 23 мая 2019

Вы можете использовать коррелированный подзапрос:

select a.*
from address as a
where a.statusdate = (select max(a2.statusdate)
                      from address as a2
                      where a2.EmployeeID_PK = a.EmployeeID_PK
                     );
0 голосов
/ 31 мая 2019

Спасибо за помощь. Я изменил код Гордона для поддержки моего запроса, ответом дали следующие.

SELECT Person.PersonID_PK, Address.Address, Address.StatusDate
FROM Person 
INNER JOIN Address 
ON Person.[PersonID_PK] = Address.PersonID_FK
WHERE (((Address.StatusDate)=(SELECT MAX(Address.StatusDate)
FROM Address
WHERE Person.PersonID_PK = Address.PersonID_FK)));
0 голосов
/ 23 мая 2019

Использование CTE с функцией ранжирования работает аккуратно.

;WITH empaddress AS 
( 
           SELECT     person.personid_pk, 
                      address.address, 
                      address.statusdate, 
                      Dense_rank() OVER (partition BY id ORDER BY statusdate DESC) AS d_rank 
           FROM       person 
           INNER JOIN address 
           ON         person.[PersonID_PK] = address.personid_fk; ) 
SELECT person.personid_pk, 
       address.address, 
       address.statusdate 
FROM   empaddress 
WHERE  d_rank = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...