0

このサイトには、指定されたキーごとに、タイムスタンプ列を持つデータベース テーブルから最新のエントリを選択することに関するいくつかの質問と回答が既にあります。以下は一例です。私はこれに似たコードを使用していました:

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
4

1 に答える 1

0

アヒルの言葉:

SELECT DISTINCT t1.FooId, t1.BarId, t1.Status, t1.ChangeDate,
t3.Status as formerStatus
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

LEFT JOIN (SELECT FooId, BarId, Status, MAX(ChangeDate) AS nextlatest
        FROM FooBarStatusUpdate
        GROUP BY FooId, BarId, Status
        ) AS t3
ON t2.FooId = t3.FooId
AND t2.BarId = t3.BarId
AND DATEDIFF(DAY, nextlatest, t2.latest) > 0
于 2013-03-29T14:22:50.250 に答える