2017-06-21 21 views
1

前の行の日付を取得し、計算してその行の下の行に回答を表示するレポートを作成しようとしています。問題の列は「時間がかかった」です。前の行の値を使用して次の行の値を計算する

など。私は3行を持っています。

 
+=====+===============+============+====+ 
|name | DatCompleted | Time Spent | idx| 
+=====+===============+============+====+ 
| A | 1/1/17  | NULL  | 0 | 
+-----+---------------+------------+----+ 
| B | 11/1/17 | 10 days | 1 | 
+-----+---------------+------------+----+ 
| C | 20/1/17 | 9 days  | 2 | 
+=====+===============+============+====+ 

時間CのC = DatCompletedを使用済 - B

のDateCompleted別にクレイジーループを使用して、行X列代わりのセットを使用してから、私はこれを完了する方法を見ることができません。 SQLでこのロジックを使用したことがありますか?もしこれについてどうやって行ったのですか?

ありがとうございます!

+1

'ラグ()'関数を使用しますhttp://meta.stackoverflow.com/([良いSQLの質問をする方法] –

+1

実際のRDBMS(製品およびバージョン)でタグを付けてくださいとお読みくださいを質問/ 271055 /質問のためのヒント - 構造的なクエリ言語の質問/ 271056)と[MCVEの作成方法](http://stackoverflow.com/help/mcve) – Shnugo

答えて

4

ほとんどのデータベースがANSI標準LAG()機能をサポートして使用することができます参考のため

ROW_NUMBER () OVER ([ PARTITION BY value_expression , ... [ n ] ] order_by_clause) 

です。日付関数は、データベースによって異なりますが、このような何か:SQL Serverでの

select t.*, 
     (DateCompleted - lag(DateCompleted) over (order by DateCompleted)) as TimeSpent 
from t; 

、あなたはdatediff()を使用します。

select t.*, 
     datediff(day, 
       lag(DateCompleted) over (order by DateCompleted), 
       DateCompleted 
       ) as TimeSpent 
from t; 
+0

これは完全に機能しました。ありがとう!! –

1

あなたは行番号の構文を使用してこれを行うことができますが、あなたがROW_NUMBER

+0

問題の例を挙げてください。 –

1

あなたは既に(上記ROWNUMBERと同様)インデックスを持っています。自分自身に参加する。

Select table1.* 
    ,TimeSpent=DateDiff("d",table1.DateCompleted,copy.DateCompleted) 
from table1 
    join table1 copy on table.idx=copy.idx-1 
関連する問題