MS Access Query для возврата самой последней даты для каждого человека с несколькими записями в таблице - PullRequest
1 голос
/ 28 июня 2019

У меня есть таблица, состоящая из участников плана медицинского страхования.

Каждая запись представляет выборы покрытия или изменение их покрытия, которое включает дату вступления в силу.Например, у каждого члена есть свой первоначальный план выборов в январе.Если в марте у члена есть ребенок и он меняет свое покрытие с одного на отдельное лицо + семья, создается запись с новой датой вступления в силу.Исходная запись остается в таблице, и создается новая запись с их новыми выборами покрытия.

Мне нужно создать запрос, который извлекает самое последнее покрытие для каждого члена таблицы, будь то их первоначальные выборы в январе или их последнее изменение покрытия в марте.

Я пробовал несколько разных операторов SQL, но ни одно из них не сработало правильно.

Таблица называется tblPreviousExport.Приведенный ниже запрос вернул 3 записи, даже не уверен, как это получилосьЯ хотел бы вернуть полную запись для каждого участника последних выборов освещения.

Любая помощь будет высоко ценится.Спасибо!

SELECT TOP 1 tblPreviousExport.[Employee SSN], tblPreviousExport.[Employee First Name], tblPreviousExport.[Employee Last Name], tblPreviousExport.[Effective Date] 
FROM tblPreviousExport 
GROUP BY tblPreviousExport.[Employee SSN], tblPreviousExport.[Employee First Name], tblPreviousExport.[Employee Last Name], tblPreviousExport.[Effective Date] 
ORDER BY tblPreviousExport.[Effective Date] DESC;

1 Ответ

1 голос
/ 28 июня 2019

Есть много способов добиться этого -


Использование объединенного подзапроса:

Один из возможных способов - использовать inner join в подзапросе, который выбирает максимальную дату вступления в силу.для каждого Employee SSN:

select t1.*
from tblPreviousExport t1 inner join
(
    select t2.[Employee SSN], max(t2.[Effective Date]) as md
    from tblPreviousExport t2
    group by t2.[Employee SSN]
) q 
on t1.[Employee SSN] = q.[Employee SSN] and t1.[Effective Date] = q.md

Использование коррелированного подзапроса:

Другой метод заключается в использовании коррелированного подзапроса, который пытается выбрать запись с более поздней датой, чем текущая.record и возвращает записи, для которых такой подзапрос не возвращает результатов (представлен выражением where not exists):

select t1.*
from tblPreviousExport t1 where not exists 
(
    select 1 from tblPreviousExport t2 
    where 
    t1.[Employee SSN]   = t2.[Employee SSN] and
    t1.[Effective Date] < t2.[Effective Date]
)

Использование LEFT JOIN с неравными критериями соединения:

Наконец, вы также можете использовать неравные критерии объединения с left join следующим образом, возвращая записи, для которых нет записей справа от объединения, которые удовлетворяют критериям объединения:

select t1.* 
from 
    tblPreviousExport t1 left join tblPreviousExport t2 on 
    t1.[Employee SSN]   = t2.[Employee SSN] and
    t1.[Effective Date] < t2.[Effective Date]
where 
    t2.[Effective Date] is null

ThisПример может быть представлен только в MS Access в представлении SQL, так как конструктор запросов MS Access не может отображать объединения, которые имеют равные критерии объединения (т. е. когда одно поле равно другому).

Этот примерФункция ample похожа на коррелированный подзапрос, но выбор выполняется соединением, а не в предложении WHERE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...