基于datetime列左连接到同一个表中的上一个记录

时间:2016-07-18 01:19:13

标签: sql-server left-join

我有一张表格,其中包含会员何时访问的详细信息。

我想基于日期时间列

对同一个表中的上一个记录进行左连接

当我查看访问数据时,我还想看看他们上一次访问的时间,以便我可以计算访问之间的时间。 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

但我甚至无法想象我是如何做到的。

2 个答案:

答案 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