如何比较 SQL 中最后一行的差异
How to compare the difference for the last row in SQL
我有一个观点,这是它的结果:
ID Type Time RowNum
18 2 2015-12-14 12:15:00.9330000 +00:00 214
18 6 2015-12-14 12:21:22.4330000 +00:00 215
18 2 2015-12-15 09:04:41.2870000 +00:00 216
18 6 2015-12-15 09:06:22.9400000 +00:00 217
18 5 2015-12-15 09:07:28.0130000 +00:00 218
我正在尝试使用下面的查询按类型比较行和组之间的时间差。我的问题是最后一行我想得到当前时间的差异并计算差异的总和。这是正在使用的查询。如何仅将最后一行与当前时间进行比较并计算总和:
WITH rows AS (SELECT * FROM [dbo].[View])
SELECT p.ID ,
p.Type ,
SUM(DATEDIFF(SECOND, p.Time, q.Time))
FROM rows p
JOIN rows q ON p.RowNum = q.RowNum - 1
GROUP BY p.ID ,
p.Type
使用LEFT JOIN
和ISNULL
函数:
DECLARE @t TABLE
(
ID INT ,
Type INT ,
Time DATETIMEOFFSET ,
RowNum INT
)
INSERT INTO @t
VALUES ( 18, 2, '2015-12-14 12:15:00.9330000 +00:00', 214 ),
( 18, 6, '2015-12-14 12:21:22.4330000 +00:00', 215 ),
( 18, 2, '2015-12-15 09:04:41.2870000 +00:00', 216 ),
( 18, 6, '2015-12-15 09:06:22.9400000 +00:00', 217 ),
( 18, 5, '2015-12-15 09:07:28.0130000 +00:00', 218 );
SELECT p.ID ,
p.Type ,
SUM(DATEDIFF(SECOND, p.Time, ISNULL(q.Time, GETDATE())))
FROM @t p
LEFT JOIN @t q ON p.RowNum = q.RowNum - 1
GROUP BY p.ID ,
p.Type
输出:
18 2 483
18 5 21186
18 6 74665
如果您使用的是 SQL Server 2012 或更高版本,这将有效
;WITH CTE AS
(
SELECT
a.ID
,a.Type
,a.Time,
ISNULL(LEAD(a.Time) OVER (Order by RowNum ASC),GETDATE()) AS NextTime
FROM
FROM [dbo].[View] a
)
SELECT
ID,
Type,
SUM(DATEDIFF(SECOND, CTE.Time, CTE.NextTime))
FROM CTE
GROUP BY
ID,
Type
LEAD()
参考
我有一个观点,这是它的结果:
ID Type Time RowNum
18 2 2015-12-14 12:15:00.9330000 +00:00 214
18 6 2015-12-14 12:21:22.4330000 +00:00 215
18 2 2015-12-15 09:04:41.2870000 +00:00 216
18 6 2015-12-15 09:06:22.9400000 +00:00 217
18 5 2015-12-15 09:07:28.0130000 +00:00 218
我正在尝试使用下面的查询按类型比较行和组之间的时间差。我的问题是最后一行我想得到当前时间的差异并计算差异的总和。这是正在使用的查询。如何仅将最后一行与当前时间进行比较并计算总和:
WITH rows AS (SELECT * FROM [dbo].[View])
SELECT p.ID ,
p.Type ,
SUM(DATEDIFF(SECOND, p.Time, q.Time))
FROM rows p
JOIN rows q ON p.RowNum = q.RowNum - 1
GROUP BY p.ID ,
p.Type
使用LEFT JOIN
和ISNULL
函数:
DECLARE @t TABLE
(
ID INT ,
Type INT ,
Time DATETIMEOFFSET ,
RowNum INT
)
INSERT INTO @t
VALUES ( 18, 2, '2015-12-14 12:15:00.9330000 +00:00', 214 ),
( 18, 6, '2015-12-14 12:21:22.4330000 +00:00', 215 ),
( 18, 2, '2015-12-15 09:04:41.2870000 +00:00', 216 ),
( 18, 6, '2015-12-15 09:06:22.9400000 +00:00', 217 ),
( 18, 5, '2015-12-15 09:07:28.0130000 +00:00', 218 );
SELECT p.ID ,
p.Type ,
SUM(DATEDIFF(SECOND, p.Time, ISNULL(q.Time, GETDATE())))
FROM @t p
LEFT JOIN @t q ON p.RowNum = q.RowNum - 1
GROUP BY p.ID ,
p.Type
输出:
18 2 483
18 5 21186
18 6 74665
如果您使用的是 SQL Server 2012 或更高版本,这将有效
;WITH CTE AS
(
SELECT
a.ID
,a.Type
,a.Time,
ISNULL(LEAD(a.Time) OVER (Order by RowNum ASC),GETDATE()) AS NextTime
FROM
FROM [dbo].[View] a
)
SELECT
ID,
Type,
SUM(DATEDIFF(SECOND, CTE.Time, CTE.NextTime))
FROM CTE
GROUP BY
ID,
Type
LEAD()
参考