这将为您提供所需的输出,并对 cte 结果进行自连接。另外,我添加了一个PARTITION BY
to the ROW_NUMBER()
:
CREATE TABLE #mytable
(
id INT ,
size INT ,
batchCode INT ,
productCode NVARCHAR(30) ,
additiontime DATETIME
);
INSERT INTO #mytable
( id, size, batchCode, productCode, additiontime )
VALUES ( 1, 91, 55555, 'BigD Red', '2017-05-15 13:00:00' ),
( 2, 91, 55555, 'BigD Red', '2017-05-15 13:00:05' ),
( 3, 94, 55555, 'BigD Red', '2017-05-15 13:00:15' ),
( 4, 91, 44444, 'BigD Blue', '2017-05-15 14:10:00' ),
( 5, 92, 44444, 'BigD Blue', '2017-05-15 14:15:00' ),
( 6, 93, 44444, 'BigD Blue', '2017-05-15 14:20:00' ),
( 7, 94, 44444, 'BigD Blue', '2017-05-15 14:30:00' ),
( 8, 91, 33333, 'BigD Orange', '2017-05-15 15:00:00' ),
( 9, 91, 33333, 'BigD Orange', '2017-05-15 15:00:10' ),
( 10, 94, 33333, 'BigD Orange', '2017-05-15 15:00:15' );
WITH rows
AS ( SELECT * ,
ROW_NUMBER() OVER ( PARTITION BY y1.batchCode ORDER BY additiontime ) AS rn
FROM #mytable y1
WHERE size = 91
AND NOT EXISTS ( SELECT *
FROM #mytable y2
WHERE y1.productCode = y2.productCode
AND y2.size = 92 )
)
SELECT t1.id ,
t1.size ,
t1.batchCode ,
t1.productCode ,
DATEDIFF(SECOND, t1.additiontime, t2.additiontime) SecondsDiff
FROM rows t1
INNER JOIN rows t2 ON t2.batchCode = t1.batchCode
AND t1.id != t2.id
WHERE t1.rn = 1;
DROP TABLE #mytable
生产:
id size batchCode productCode SecondsDiff
8 91 33333 BigD Orange 10
1 91 55555 BigD Red 5
请注意,您应该使用更大的数据集进行测试,以确保准确性并考虑任何其他场景。