2

手始めに、私は過去 4 時間インターネットを精査してきましたが、いくつかの同様の問題 (ほとんどはスタック オーバーフローに関する問題) に出くわしました。 )。

Personnel と Tests の 2 つのテーブルがあります。Personnel には、SSN によって索引付けされた各個人に関する情報が含まれています。そのような:

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

Tests は、各人が受けたテストに関する情報を含むテーブルです。これらのテストは、SSN によって Personnel テーブルに関連付けられています。各人は、任意の数のテストを受けることができます。

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 ごとに 1 つのレコードのみを取得し、必要なフィールドを選択することができないようです。すべてがすべてのテストと必要なフィールドを選択するか、1 つのテストで 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

この問題を解決するには多くの方法がありますが、私が慣れている解決策は次のようなものです。通常、 と の間の結合はPersonnelすべてTestのレコードを提供しますが、それはまさにあなたが望むものではありません。したがってTestDate、すべての最新情報を取得するサブクエリと結合し、サブクエリSSNの結果は、2 つの条件で一致した場合に 2 つのテーブルに結合されSSNますTestDate

于 2013-05-10T16:45:08.993 に答える