行間の値を計算する必要がある場合の一般的なアプローチ

次の表については、

Id    Timestamp    AssignedTo
1     2012-01-01   User1
2     2012-01-02   User2
3     2012-01-10   User3
4     2012-01-15   User1

エンティティが特定のユーザに割り当てられた日数/時間/分を計算するには、MS SQL Serverの一般的なアプローチがどうなりますか?

開発者(基本的なSQLの知識を持つ)として、私はこれらの種類のクエリを実行するときに、関数またはストアドプロシージャを常に選択しました(これらの種類=クエリはセット内の2つの行の違いに基づいて結果を含みます)。

この例では、アイテム上でカーソルを繰り返し、前の変数を変数に保存してから差を計算します。しかし、私はこれが重大なパフォーマンス上の懸念であると言われています。特に大きなセットではそうです。

EDIT:サンプル結果

User    TotalTime
User1   23d
User2   8d
User3   5d

すなわちアイテムが特定のユーザに割り当てられた合計時間である。 User1のTotalTimeは、割り当てられた最初の日とともに、2012-01-15(今は2012年2月6日)から割り当てられているため、23日間です。

1
データベースによっては、高度なSQL機能を使用することができるので、どのデータベースですか?また、いくつかの出力例を提供できますか?あなたが期待していた結果が分からない
追加された 著者 Lukas Eder,
ひどいのはMSSQL/SQL Serverなので、 ROWS 1 PRECEDING と同様のウィンドウ関数構造は使用できません。しかし、ここでこの質問をチェックすると、同様の問題に対するいくつかの回答が含まれます: stackoverflow.com/questions/860966/…
追加された 著者 Lukas Eder,
これらの日に User2 に割り当てられていたため、@El:2 3 4 5 6 7 8 9
追加された 著者 AakashM,
なぜ User2 のTotalTime = 8dですか?
追加された 著者 El Ronnoco,
@AakashM Right!ダフットに申し訳ありません:D
追加された 著者 El Ronnoco,
サンプルデータとMSSQL DBMSを追加しました。
追加された 著者 grimstoner,

1 答え

この例では、select文でサブクエリを使用して各行の終了日を取得し、この終了日を使用して特定のユーザーに割り当てられた時間を取得します。以下はSQL Serverの構文ですが、RDBMSに関係なく同じプリンシパルを適用できます。

SELECT  AssignedTo, 
        SUM(DATEDIFF(DAY, TimeStamp, ISNULL(EndDate, GETDATE()))) [Days]
FROM    (   SELECT  ID,
                    [TimeStamp],
                    AssignedTo,
                    (   SELECT  MIN(TimeStamp)
                        FROM    [YOURTABLE] b
                        WHERE   b.TimeStamp > a.TimeStamp
                    ) [EndDate]
            FROM    [YOURTABLE] a
        )  a
GROUP BY AssignedTo
2
追加された
+1天才の答え!
追加された 著者 El Ronnoco,
私が一般的なアプローチを探していたにもかかわらず、この答えは私につながりました...私が信じるものの実践的な例は集合理論です。
追加された 著者 grimstoner,