2017-10-27 18 views
1

私はSQLクエリに小さな問題があります。私は、SQL Server 2008のデータベースを使用しています、私は数日の間にサイトID、日付からtoDateまでを渡すために、現在の行と条件は私が必要な場所で日時に基づいて、列cumulativeValueの前の行との間の差を計算したいです私はデータを取得する必要があります。以下の表は、次のとおりです。datetimeに基づく現在の行と前の行の違いについてのsqlクエリ

ID  siteId    readtime    cumulativeValue 
1  GAF1608187   2017-10-18 12:59:03.000   20 
2  GAF1604620   2017-10-18 11:38:33.000   10 
3  GAF1608187   2017-10-19 14:59:00.000   40 
4  GAF1608187   2017-10-19 16:07:46.000   65 
5  GAF1604620   2017-10-19 11:41:49.000   55 
6  GAF1604620   2017-10-20 10:52:35.000   120 
7  GAF1608187   2017-10-20 16:10:15.000   90 
8  GAF1608187   2017-10-21 16:13:19.000   120 
9  GAF1604620   2017-10-21 11:44:42.000   180 
10  GAF1604620   2017-10-22 11:05:50.000   230 

出力は次のようになります。

ID  siteId    readtime    cumulativeValue difference 

2  GAF1604620   2017-10-18 11:38:33.000   10    10 
5  GAF1604620   2017-10-19 11:41:49.000   55    45 
6  GAF1604620   2017-10-20 10:52:35.000   120    75 
9  GAF1604620   2017-10-21 11:44:42.000   180    60 
10  GAF1604620   2017-10-22 11:05:50.000   230    50 

SQL Serverの2012+では:-)

+0

何これまでにやったことはありますか? –

答えて

2

ありがとう、あなたはlag()を使用することができ、このクエリで私を助けてください。 SQL Server 2008では、applyを使用します。

select t.*, 
     coalesce(t.cumulativeValue - tprev.cumulativeValue, t.cumulativeValue) as diff 
from t outer apply 
    (select top 1 tprev.* 
     from t tprev 
     where tprev.siteId = t.siteId and tprev.readtime < t.readtime 
     order by tprev.readtime desc 
    ) tprev; 
+0

ありがとう、@ Gordon Linoffこのクエリは完璧に動作します – Naveen

0

あなたのバンは、共通テーブル式とROW_NUMBER()を使用しますとA.row = B.row上の行に参加する - このように1:

WITH CTE AS 
(
SELECT TOP 10 DATECOLUMN, ROW_NUMBER() OVER (ORDER BY DATECOLUMN) AS ROW_Num 
FROM Table_A 
) 

SELECT * FROM CTE AS A 
INNER JOIN CTE AS B ON A.ROW_Num = B.ROW_Num - 1 
ORDER BY A.ROW_Num 
+0

なぜ同じ2つのCTEを作成しますか?その状態でAとBと同じCTEに参加してください。 –

+0

正しく、コードは少ないです。編集されました。 –

関連する問題