首先,我在过去的四个小时里一直在搜索互联网,并且遇到了一些类似的问题(大部分是关于堆栈溢出)的解决方案看起来可以工作,但没有(大多数都使用过)单表)。
我有两张桌子 - 人员和测试。人员包含有关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。
我希望这是一个简单的解决方案,会让我的前额受到打击。
答案 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
有很多方法可以解决这个问题,但我以前的解决方案就是这样。通常情况下,Personnel
和Test
之间的联接会提供所有记录,但这并不是您想要的。所以我加入了一个子查询,它为每个TestDate
获取最新的SSN
,然后将子查询的结果连接回两个表,前提是它在两个条件下匹配:SSN
和TestDate
。