0

MS SQL Server 2008 R2 にはテーブル Foo があり、Foo の挿入と更新のたびに、日付、ユーザー、PK FooId、および 1 つの数値を含む Foo の他のいくつかの列も FooAuditLog に挿入します。それをcxpと呼びます。

ここで、特定の FooId の cxp に対する経時的な変更履歴を取得する必要があります。しかし、cxp を変更せずに Foo を保存することは可能であり、それらの値を無視する必要があります。

たとえば、特定の Foo (つまりselect date, user, cxp from FooAuditLog where fooId=17) の監査ログ エントリが次のようになっているとします。

Date      User     Cxp
-------------------------
10/26     Fred     42
10/28     George   38
11/7      Tom      38
11/9      Fred     38
11/12     Joe      33
11/14     Tom      33
11/18     George   38

次に、次のみを返すようにクエリを変更する必要があります。

Date      User     Cxp
-----------------------------
10/26     Fred     42
10/28     George   38
11/12     Joe      33
11/18     George   38

11/7、11/9、11/14 のエントリは無視してください。を検討しましたselect distinct (cpx) ... group by dateが、値が以前の値に戻るエントリをキャプチャする必要があります。

4

1 に答える 1

1

前の値を取得する必要があります。このバージョンでは、MySQL構文と相関サブクエリを使用して結果を取得します。

select t.*
from (select t.*,
             (select cxp from t t2 where t2.date < t.date order by date desc limit1
             ) as prevcxp
      from t
     ) t
where prevcxp is NULL or prevcxp <> cxp

他のデータベースでlag()は、サブクエリの代わりにを使用する場合があり、はまたはlimitに置き換えられる場合があります。topfetch first 1 row

于 2013-02-08T18:59:33.703 に答える