将SQL行分组到事务中,然后计算持续时间

将SQL行分组到事务中,然后计算持续时间,sql,sql-server,Sql,Sql Server,我有一张结构与下面一样的桌子。我想知道是否可以通过TransactionID压缩每个事务,从第一行和最后一行提取值,然后最终计算事务的持续时间 例如下面,我想提取RecordID和CustomerID。然后别名一个名为startingStatus的新列,该列将从第一行“提交”。我将为第二列命名为endingStatus,它将是最后一行中的“Success”。然后我需要以同样的方式获取时间戳,创建startingTime和endingTime。最后一列是以秒为单位开始和结束的差值 RecordID

我有一张结构与下面一样的桌子。我想知道是否可以通过TransactionID压缩每个事务,从第一行和最后一行提取值,然后最终计算事务的持续时间

例如下面,我想提取RecordID和CustomerID。然后别名一个名为startingStatus的新列,该列将从第一行“提交”。我将为第二列命名为endingStatus,它将是最后一行中的“Success”。然后我需要以同样的方式获取时间戳,创建startingTime和endingTime。最后一列是以秒为单位开始和结束的差值

RecordID    TransactionID   CustomerID  Status          TimeStamp
1                   12          10      Submitted       04/07/2014 14:32:23
2                   12          10      Queued          04/07/2014 14:32:24
3                   12          10      Processing      04/08/2014 14:32:26
4                   12          10      Error           04/09/2014 14:32:27
5                   12          10      Resubmitted     04/10/2014 15:12:29
6                   12          10      Queued          04/11/2014 15:12:31
7                   12          10      Processing      04/12/2014 15:12:34
8                   12          10      Success         04/13/2014 15:12:47
我一直在尝试按TransactionID分组,并使用最小值和最大值,但我还没有让它工作

我该怎么做这样的事情呢

试试看:

SELECT 
    CustomerID, 
    TransactionID, 
    Min([TimeStamp]) as StartTime, 
    Max([TimeStamp]) as EndTime,
    DATEDIFF(MINUTE,Min([TimeStamp]),Max([TimeStamp])) as TransactionTime
FROM YourTable
GROUP BY CustomerID, TransactionID
ORDER BY CustomerID, TransactionID

我将使用窗口函数检索组的第一个和最后一个记录

这将适用于SQL Server 2005及更高版本,方法是使用ROW_NUMBER()窗口函数,然后在以下情况下使用MAX/CASE方法旋转结果:

SELECT 
    [TransactionID], 
    [CustomerID], 
    MAX(CASE WHEN [rn_asc] = 1 THEN [Status] ELSE NULL END) [startingStatus], 
    MAX(CASE WHEN [rn_desc] = 1 THEN [Status] ELSE NULL END) [endingStatus], 
    MAX(CASE WHEN [rn_asc] = 1 THEN [TimeStamp] ELSE NULL END) [startingTimeStamp], 
    MAX(CASE WHEN [rn_desc] = 1 THEN [TimeStamp] ELSE NULL END) [endingTimeStamp],
    DATEDIFF(
        SECOND,
        MAX(CASE WHEN [rn_asc] = 1 THEN [TimeStamp] ELSE NULL END),
        MAX(CASE WHEN [rn_desc] = 1 THEN [TimeStamp] ELSE NULL END) 
    ) [duration]
FROM  
    ( 
        SELECT 
            [TransactionID], 
            [CustomerID], 
            ROW_NUMBER() OVER (PARTITION BY [TransactionID], [CustomerID] ORDER BY [RecordID] ASC) [rn_asc], 
            ROW_NUMBER() OVER (PARTITION BY [TransactionID], [CustomerID] ORDER BY [RecordID] DESC) [rn_desc], 
            [Status], 
            [Timestamp] 
        FROM [tbl]
    ) A 
GROUP BY  
    [TransactionID], 
    [CustomerID] 

SQL Server 2012引入了FrestStValk函数,因此,如果运行该版本,则可以考虑此查询

SELECT DISTINCT
    [TransactionID], 
    [CustomerID], 
    FIRST_VALUE([Status]) OVER (PARTITION BY [TransactionID], [CustomerID] ORDER BY [RecordID] ASC) [startingStatus], 
    FIRST_VALUE([Status]) OVER (PARTITION BY [TransactionID], [CustomerID] ORDER BY [RecordID] DESC) [endingStatus],
    FIRST_VALUE([TimeStamp]) OVER (PARTITION BY [TransactionID], [CustomerID] ORDER BY [RecordID] ASC) [startingTimeStamp], 
    FIRST_VALUE([TimeStamp]) OVER (PARTITION BY [TransactionID], [CustomerID] ORDER BY [RecordID] DESC) [endingTimeStamp],
    DATEDIFF(
        SECOND,
        FIRST_VALUE([TimeStamp]) OVER (PARTITION BY [TransactionID], [CustomerID] ORDER BY [RecordID] ASC),
        FIRST_VALUE([TimeStamp]) OVER (PARTITION BY [TransactionID], [CustomerID] ORDER BY [RecordID] DESC)
    ) [duration]
FROM [tbl]