我会建议使用下面的代码。这个想法是选择所有具有非空条目值的行(en),然后将其与具有相同ID但具有大于条目时间戳(,例如)的退出时间戳的记录结合。最后,左连接(xex)用于确保没有其他具有在en和ex之间的退出时间戳的行。
-- data stored as per original question
CREATE TABLE #tbl
(
[id] INT NOT NULL,
[entrance] DATETIME,
[exit] DATETIME
);
INSERT INTO #tbl ([id], [entrance], [exit])
VALUES (10000, '2017-06-03 09:07:00.000', NULL);
INSERT INTO #tbl ([id], [entrance], [exit])
VALUES (10000, NULL, '2017-06-03 11:59:00.000');
INSERT INTO #tbl ([id], [entrance], [exit])
VALUES (10000, NULL, '2017-06-03 12:31:00.000');
INSERT INTO #tbl ([id], [entrance], [exit])
VALUES (10000, '2017-06-03 12:25:00.000', NULL);
INSERT INTO #tbl ([id], [entrance], [exit])
VALUES (20000, '2017-06-03 13:13:00.000', NULL);
INSERT INTO #tbl ([id], [entrance], [exit])
VALUES (20000, NULL, '2017-06-03 17:39:00.000');
SELECT en.id, en.[entrance], ex.[exit],
DATEDIFF(MINUTE, en.[entrance], ex.[exit]) elapsed_min
FROM #tbl en
JOIN #tbl ex ON en.id=ex.id AND ex.[exit] IS NOT NULL AND ex.[exit] > en.[entrance]
LEFT JOIN #tbl xex ON en.id=xex.id AND xex.[exit] IS NOT NULL
AND xex.[exit] < ex.[exit] AND xex.[exit] > en.[entrance]
WHERE en.entrance IS NOT NULL AND xex.[id] IS NULL;
GO
-- data stored as per comment
CREATE TABLE #tbl2
(
[id] INT NOT NULL,
[type] CHAR(1) NOT NULL,
[timestamp] DATETIME NOT NULL
);
INSERT INTO #tbl2 ([id], [type], [timestamp])
VALUES (10000, 'E', '2017-06-03 09:07:00.000');
INSERT INTO #tbl2 ([id], [type], [timestamp])
VALUES (10000, 'S', '2017-06-03 11:59:00.000');
INSERT INTO #tbl2 ([id], [type], [timestamp])
VALUES (10000, 'S', '2017-06-03 12:31:00.000');
INSERT INTO #tbl2 ([id], [type], [timestamp])
VALUES (10000, 'E', '2017-06-03 12:25:00.000');
INSERT INTO #tbl2 ([id], [type], [timestamp])
VALUES (20000, 'E', '2017-06-03 13:13:00.000');
INSERT INTO #tbl2 ([id], [type], [timestamp])
VALUES (20000, 'S', '2017-06-03 17:39:00.000');
SELECT en.id, en.[timestamp], ex.[timestamp],
DATEDIFF(MINUTE, en.[timestamp], ex.[timestamp]) elapsed_min
FROM #tbl2 en
JOIN #tbl2 ex ON en.id=ex.id AND ex.[type]='S' AND ex.[timestamp] > en.[timestamp]
LEFT JOIN #tbl2 xex ON en.id=xex.id AND xex.[type]='S'
AND xex.[timestamp] < ex.[timestamp] AND xex.[timestamp] > en.[timestamp]
WHERE en.[type]='E' AND xex.[id] IS NULL;
GO
对不起,我没有告诉,数据库是SQL 2000 –
停止一切你在做什么,并升级到支持的版本。只是一些建议。这是4年前结束的生命支持。 – scsimon
数据库中没有“行”。除非您指定要订购的内容,否则该数据将被视为无序。你有没有可靠的排序栏(例如最后更新,或标识栏)? –