我有一张表格,其中包含会员何时访问的详细信息。
我想基于日期时间列
对同一个表中的上一个记录进行左连接当我查看访问数据时,我还想看看他们上一次访问的时间,以便我可以计算访问之间的时间。 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 :(得分:2)
您不指定SQL Server的哪个版本,因此对于SQL Server 2012以上版本:
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
答案 1 :(得分: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