为每个唯一标识符选择具有最新日期的记录

时间:2013-05-10 16:41:02

标签: sql ms-access ms-office

首先,我在过去的四个小时里一直在搜索互联网,并且遇到了一些类似的问题(大部分是关于堆栈溢出)的解决方案看起来可以工作,但没有(大多数都使用过)单表)。

我有两张桌子 - 人员和测试。人员包含有关SSN索引的每个人的信息。如:

ID   SSN          PersonName
101  111-11-1111  Joe
102  222-22-2222  Bob
103  333-33-3333  Jebadiah

测试是一个表,其中包含有关每个人所进行的测试的信息。这些测试与SSN的人员表有关。每个人都可以进行任何数量的测试:

ID   SSN          TestDate  Score
201  111-11-1111  1/1/2013  95.7
202  111-11-1111  2/7/2013  75.2
203  222-22-2222  1/9/2013  85.6
204  333-33-3333  5/6/2013  79.9
205  333-33-3333  4/8/2013  88.8

我需要做的是为每个人选择最近的考试日期和分数。我正在寻找一个如下所示的结果集:

SSN          PersonName  TestDate  Score
111-11-1111  Joe         2/7/2013  75.2
222-22-2222  Bob         1/9/2013  85.6
333-33-3333  Jebadiah    5/6/2013  79.9

我一直在尝试很多连接等等,但我似乎无法让它为每个SSN只检索一条记录并选择我想要的字段。一切都将选择每个测试和我想要的字段或一个测试,但只选择SSN。

我希望这是一个简单的解决方案,会让我的前额受到打击。

1 个答案:

答案 0 :(得分:3)

SELECT  a.SSN, a.PersonName, b.TestDate, b.Score
FROM    ((Personnel AS a
        INNER JOIN Tests AS b
            ON a.SSN = b.SSN)
        INNER JOIN
        (
            SELECT  SSN, MAX(TestDate) AS MAX_DATE
            FROM    Tests 
            GROUP   BY SSN
        ) AS c  ON  b.SSN = c.SSN AND
                b.TestDate = c.MAX_DATE)

更新1

有很多方法可以解决这个问题,但我以前的解决方案就是这样。通常情况下,PersonnelTest之间的联接会提供所有记录,但这并不是您想要的。所以我加入了一个子查询,它为每个TestDate获取最新的SSN,然后将子查询的结果连接回两个表,前提是它在两个条件下匹配:SSNTestDate