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