2016-07-18 6 views
1

メンバーがいつ訪問したかの詳細を含むテーブルがあります。datetime列に基づいて同じテーブルの前のレコードに結合を残しました

私は私が訪問データを見るとdatetime型の列に基づいて、同じテーブル内の前のレコードに参加

私も、以前の訪問はので、私はどのくらいの時間を計算することができた時に見たい左をしたいです訪問間でした。 VisitDateTime列はdatetimeデータ型です。テーブルには潜在的に何億もの行があります。

例データ:

希望:だから

MemberID VisitDateTime 
1  2016-01-01 10:00:00.000 
2  2016-01-01 10:01:00.000 
1  2016-01-01 11:00:00.000 
2  2016-01-01 11:30:00.000 
3  2016-01-01 11:45:00.000 
1  2016-01-01 11:50:00.000 

私はそのメンバーの前のVisit.VisitDateTimeで、それ自体に戻ってテーブルに参加しようとしているがPreviousVisitDateTime列として表示結果:

MemberID VisitDateTime   PreviousVisitDateTime 
1  2016-01-01 10:00:00.000 null 
2  2016-01-01 10:01:00.000 null 
1  2016-01-01 11:00:00.000 2016-01-01 10:00:00.000 
2  2016-01-01 11:30:00.000 2016-01-01 10:01:00.000 
3  2016-01-01 11:45:00.000 null 
1  2016-01-01 11:50:00.000 2016-01-01 11:00:00.000 

しかし、私も時間を想像することはできません私はこれをやり遂げるつもりだ。

+0

使用しているSQL Serverのバージョンは? –

答えて

2

あなたは、SQL Server 2012年以降のためになるよう、SQL Serverのバージョンを指定いけない:あなたが左にそれをしたい場合は

CREATE TABLE #Test (MemberID INT, VisitDateTime DATETIME); 

INSERT INTO #Test(MemberID, VisitDateTime) VALUES 
(1, '2016-01-01 10:00:00.000'), 
(2, '2016-01-01 10:01:00.000'), 
(1, '2016-01-01 11:00:00.000'), 
(2, '2016-01-01 11:30:00.000'), 
(3, '2016-01-01 11:45:00.000'), 
(1, '2016-01-01 11:50:00.000') 

SELECT MemberID 
     ,VisitDateTime, 
     LAG(VisitDateTime) OVER (PARTITION BY MemberID ORDER BY VisitDateTime) PreviousVisit FROM #Test 
     ORDER BY VisitDateTime; 


    MemberID VisitDateTime   PreviousVisit 
----------- ----------------------- ----------------------- 
1   2016-01-01 10:00:00.000 NULL 
2   2016-01-01 10:01:00.000 NULL 
1   2016-01-01 11:00:00.000 2016-01-01 10:00:00.000 
2   2016-01-01 11:30:00.000 2016-01-01 10:01:00.000 
3   2016-01-01 11:45:00.000 NULL 
1   2016-01-01 11:50:00.000 2016-01-01 11:00:00.000 

、2008年にLAGをシミュレートするために、参加Alternate of lead lag function in sql server 2008

+0

おかげでLes、それは素晴らしい答えです、私は本当に便利な新しいSQLのトリックを学びました! –

+0

問題ありません。ここにいくつかのより便利なリファレンスがあります。https://msdn.microsoft.com/en-us/library/ms189461.aspx –

0

を試してみてください:

SELECT a.MemberID, a.Visitdatetime,MIN(b.visitdatetime) 
FROM #Test a 
LEFT JOIN #Test b on b.MemberID=a.MemberID and b.visitDateTime < a.visitDateTime 
GROUP BY a.MemberID,a.VisitDateTime 
ORDER BY a.visitdatetime 
+0

Davidさん、ありがとうございます。これは動作しますが、LAG/PARTITIONソリューションはサブ1秒。 –

+0

私はそれが最適な解決策ではないことを知っています。私はこれを投稿する前に、もう一つの答え(それは良い)を見た。私はちょうどあなたの元の質問は、具体的に左のロジックを結合するために求めたので、私はそれを言及すべきだと思った:-) –

関連する問題