このサイトには、指定されたキーごとに、タイムスタンプ列を持つデータベース テーブルから最新のエントリを選択することに関するいくつかの質問と回答が既にあります。以下は一例です。私はこれに似たコードを使用していました:
SELECT DISTINCT t1.FooId, t1.BarId, t1.Status, t1.ChangeDate
FROM FooBarStatusUpdate t1
INNER JOIN (SELECT FooId, BarId, MAX(ChangeDate) AS latest
FROM FooBarStatusUpdate
GROUP BY FooId, BarId) AS t2
ON t1.FooId = t2.FooId
AND t1.BarId = t2.BarId
AND t1.ChangeDate = t2.latest
問題のテーブルには、Foo と Bar の間の多対多のマッピング、Bar 内の Foo のステータス、およびステータスが変更された日付が保持されます。このテーブルには、Bar が最初に Foo に割り当てられた時点から始まるすべてのステータス変更のエントリがあります。
先日、同じキーで最新の項目だけでなく、直前のエントリを選択する方法についてアヒルに尋ねる必要がありました。この場合は、先月の変更点を示すレポートであり、変更点だけでなく、変更点も示す必要がありました。クライアントが緊急に必要としているこのレポートの結果を取得するには、上記のクエリをどのように変更すればよいでしょうか?
さて、アヒルは私が必要としていたものを私に与えてくれたので、コミュニティを助けることを期待して、以下の私自身の答えがここにあります.
編集(JWの要求による):
これが私の元のデータであるとします:
FooId BarId Status ChangeDate
2 5 New 03/27/2012
2 5 Commit 05/04/2012
2 5 Complete 07/20/2012
3 8 New 06/18/2012
3 8 Commit 08/12/2012
次に、最初のクエリ (上記) は次を返します。
FooId BarId Status ChangeDate
2 5 Complete 07/20/2012
3 8 Commit 08/12/2012
私が新しいクエリに実行させたいこと (そして私の答えが実際に実行すること) は次のとおりです。
FooId BarId Status Change Date Prior Status
2 5 Complete 07/20/2012 Commit
3 8 Commit 08/12/2012 New