someIDで識別される別のエンティティの時系列を表す単純なテーブルがあるとします。各行はsomeIDとタイムスタンプで識別されます。タイムスタンプは定期的な増分の対象ではありません。つまり、間隔は次のように変化する可能性があります。
CREATE TABLE someSeries
(
someID int not null,
rowTS datetime not null,
val int not null
);
ALTER TABLE someSeries
ADD CONSTRAINT PK_someSeries(someID, rowTS);
すべての行を返し、その行のrowTSとそのsomeIDの最新の前のrowTSを表示するためのエレガントで効率的な方法(デカルト積を使用しない)はありますか?
たとえば、データが
someID rowTS val
------------------------------------
1 9/1/2012 2
1 9/2/2012 3
1 9/5/2012 5
2 9/2/2012 1
2 9/4/2012 6
3 9/5/2012 7
3 9/7/2012 9
3 9/10/2012 2
そのクエリは
someID rowTS prevRowTS val prevVal
------------------------------------------------------------------------
1 9/1/2012 null 2 null
1 9/2/2012 9/1/2012 3 2
1 9/5/2012 9/2/2012 5 3
2 9/2/2012 null 1 null
2 9/4/2012 9/2/2012 6 1
3 9/5/2012 null 7 null
3 9/7/2012 9/5/2012 9 7
3 9/10/2012 9/7/2012 2 9
現在、アプリにこのようなものが必要です。これを行う方法はアプリケーション層です。基本的に、最後のrowTSをPKであるsomeIDマスターテーブルに格納し、時系列を挿入すると、次のようになります。マスターテーブルから値を取得し、最新の前のレコードを検索し、いくつかの計算(valとprevValの比較など)を実行して、時系列テーブルに挿入します。
しかし、SQLだけでそれを行うための高速な方法があるかどうか疑問に思いました。頭に浮かぶのはデカルト積だけですが、言うまでもなく、それはあまり効率的ではありません。