sql server 2012或2008中两行之间的时差

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

我正在尝试登录用户页面访问, 我只记录页面名称、会话id和输入时间

我需要找到每一页的持续时间,这意味着下一页的进入时间就是上一页的退出时间

我有一张这样的桌子:

    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+上可用。