2012-02-06 3 views
1

間の値を計算する必要がとき:一般的なアプローチで、次の表の行

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日間です。

+0

データベースによっては、高度なSQL機能を使用することができるため、どのようなデータベースですか?また、いくつかの出力例を提供できますか?どのような結果が期待できるのかよくわかりません... –

+0

サンプルデータとMSSQL DBMSが追加されました。 – grimstoner

+0

MSSQL/SQL Serverがひどいので、 '' ROWS 1 PRECEDING'やそれに類するウィンドウ関数の構造を使うことはできません。しかし、ここでこの質問をチェックすると、同様の問題に対する答えが含まれます:http://stackoverflow.com/questions/860966/calculate-a-running-total-in-sqlserver –

答えて

2

この例では、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 
+0

+1 Geniusの回答! –

+0

私は一般的なアプローチを探していましたが、この答えは私につながりました...私が信じるものの実例は集合理論です。 – grimstoner

関連する問題