sql server 2012或2008中两行之间的时差
我正在尝试登录用户页面访问, 我只记录页面名称、会话id和输入时间 我需要找到每一页的持续时间,这意味着下一页的进入时间就是上一页的退出时间 我有一张这样的桌子:sql server 2012或2008中两行之间的时差,sql,sql-server,sql-server-2008,sql-server-2012,Sql,Sql Server,Sql Server 2008,Sql Server 2012,我正在尝试登录用户页面访问, 我只记录页面名称、会话id和输入时间 我需要找到每一页的持续时间,这意味着下一页的进入时间就是上一页的退出时间 我有一张这样的桌子: sessionId | PageName | EntryTime -------------------------------------------------------------- xxxxxx1 | SignIn | 2015-10-13 13:03:4
sessionId | PageName | EntryTime
--------------------------------------------------------------
xxxxxx1 | SignIn | 2015-10-13 13:03:45.000
xxxxxx1 | Landing | 2015-10-13 13:04:00.000
xxxxxx1 | Users | 2015-10-13 13:04:30.000
sessionId | PageName | EntryTime | Duration(mm:ss)
--------------------------------------------------------------------------
xxxxxx1 | SignIn | 2015-10-13 13:03:45.000 | 00:15
xxxxxx1 | Landing | 2015-10-13 13:04:00.000 | 00:30
xxxxxx1 | Users | 2015-10-13 13:04:30.000 | 00:00
我需要这样的输出:
sessionId | PageName | EntryTime
--------------------------------------------------------------
xxxxxx1 | SignIn | 2015-10-13 13:03:45.000
xxxxxx1 | Landing | 2015-10-13 13:04:00.000
xxxxxx1 | Users | 2015-10-13 13:04:30.000
sessionId | PageName | EntryTime | Duration(mm:ss)
--------------------------------------------------------------------------
xxxxxx1 | SignIn | 2015-10-13 13:03:45.000 | 00:15
xxxxxx1 | Landing | 2015-10-13 13:04:00.000 | 00:30
xxxxxx1 | Users | 2015-10-13 13:04:30.000 | 00:00
我试过这个:
WITH LogsTable AS
(
select ROW_NUMBER() OVER (ORDER BY [EntryTime]) -- Create an index number ordered by time.
AS [Sequence], EntryTime from TblLOGPageVisits where SessionIdUnique = '3t5sk1t0ix5wnj22yshodepy'
)
SELECT *,
ISNULL(DATEDIFF(SECOND,
(SELECT other.EntryTime
FROM
(
select ROW_NUMBER() OVER (ORDER BY [EntryTime]) AS [Sequence],
* from TblLOGPageVisits where SessionIdUnique = '3t5sk1t0ix5wnj22yshodepy') as Other
WHERE other.Sequence = LogsTable.Sequence - 1
),
LogsTable.EntryTime
), 0)
AS Duration
FROM LogsTable;
其输出为:
Sequence | sessionId | PageName | EntryTime | Duration(mm:ss)
--------------------------------------------------------------------------------------------
1 | xxxxxx1 | SignIn | 2015-10-13 13:03:45.000 | 0
2 | xxxxxx1 | Landing | 2015-10-13 13:04:00.000 | 1500
3 | xxxxxx1 | Users | 2015-10-13 13:04:30.000 | 3000
如何实现我所需的输出
我的查询出了什么问题?对于SQL Server 2012,您可以使用该函数
您可以按为不同的
会话ID
添加一个额外的分区。如果您有机会使用SQL Server 2012,请按照建议使用函数。如果不是,您可以使用变通方法,但不幸的是,您必须两次加入同一个表
DECLARE @LogsTable TABLE
(
sessionId VARCHAR(10)
, PageName VARCHAR(10)
, EntryTime DATETIME2
);
INSERT INTO @LogsTable
VALUES ('xxxxxx1', 'SignIn', '2015-10-13 13:03:45.000')
, ('xxxxxx1', 'Landing', '2015-10-13 13:04:00.000')
, ('xxxxxx1', 'Users', '2015-10-13 13:04:30.000');
;WITH cte (sessionId, PageName, EntryTime, RN, PRN)
AS (
SELECT sessionId
, PageName
, EntryTime
, ROW_NUMBER() OVER(PARTITION BY sessionId ORDER BY EntryTime)
, ROW_NUMBER() OVER(PARTITION BY sessionId ORDER BY EntryTime) + 1
FROM @LogsTable
)
SELECT C1.RN AS Sequence
, C1.sessionId
, C1.PageName
, C1.EntryTime
, COALESCE(CAST(DATEDIFF(MM, C1.EntryTime, C2.EntryTime) AS VARCHAR(10)) + ':' + CAST(DATEDIFF(SS, C1.EntryTime, C2.EntryTime) AS VARCHAR(10)), '00:00') AS Duration
FROM cte AS C1
LEFT JOIN cte AS C2
ON C2.sessionId = C1.sessionId
AND C2.RN = C1.PRN;
输出:
╔══════════╦═══════════╦══════════╦═════════════════════════════╦══════════╗
║ Sequence ║ sessionId ║ PageName ║ EntryTime ║ Duration ║
╠══════════╬═══════════╬══════════╬═════════════════════════════╬══════════╣
║ 1 ║ xxxxxx1 ║ SignIn ║ 2015-10-13 13:03:45.0000000 ║ 0:15 ║
║ 2 ║ xxxxxx1 ║ Landing ║ 2015-10-13 13:04:00.0000000 ║ 0:30 ║
║ 3 ║ xxxxxx1 ║ Users ║ 2015-10-13 13:04:30.0000000 ║ 00:00 ║
╚══════════╩═══════════╩══════════╩═════════════════════════════╩══════════╝
看看函数。子句WHERE other.Sequence=LogsTable.Sequence-1
应该是WHERE other.Sequence=LogsTable.Sequence+1
。这将返回下一个输入时间,而不是上一个。抛出错误:“LEAD”不是可识别的内置函数名。@Jake745,LEAD
仅在SQL Server 2012+上可用。