2

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

我有两张桌子 - 人员和测试。Personnel 包含有关由 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。

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

4

1 回答 1

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.

于 2013-05-10T16:45:08.993 回答