Это на самом деле работа с догадками, так как данные примера и ожидаемый результат, предоставленные OP, похоже, не коррелируют. Это дает правильные результаты для USERNAME NULL
, 'ANDJOH0427'
, 'HORDOU0521'
и 'DWYGRE0609'
, однако возвращает результат для 'PRIADA747'
(который исключен из ожидаемого набора результатов) и дает совсем другой ответ для 'POUJON702'
:
USE Sandbox;
GO
CREATE TABLE #Sample ([KEY] varchar(15),
WORKSTATION varchar(5),
[STATUS] varchar(6),
USERNAME varchar(10),
[TIMESTAMP] datetime);
INSERT INTO #Sample
VALUES ('181861-0001-001',NULL,'Closed',NULL,'2015-07-01T18:19:48.527'),
('181861-0001-001',NULL,'Closed',NULL,'2015-07-01T20:20:46.383'),
('181861-0001-001','1AHVW','Open','ANDJOH0427','2015-07-01T13:18:46.547'),
('181861-0001-001','1AHVW','Closed','ANDJOH0427','2015-07-01T14:11:41.920'),
('181861-0001-001','1ALVW','Closed','DWYGRE0609','2015-07-01T18:29:39.127'),
('181861-0001-001','1ALVW','Closed','DWYGRE0609','2015-07-01T18:29:40.300'),
('181861-0001-001','1AHVW','Closed','HORDOU0521','2015-07-01T19:27:34.667'),
('181861-0001-001','1AHVW','Closed','HORDOU0521','2015-07-01T19:44:36.167'),
('181861-0001-001','1AQCI','Open','POUJON702','2015-07-02T00:46:37.540'),
('181861-0001-001','1ALVW','Open','PRIADA747','2015-07-01T14:51:02.937'),
('181861-0001-001','1ALVW','Open','PRIADA747','2015-07-01T15:29:48.357'),
('181861-0001-001','1ALVW','Open','PRIADA747','2015-07-01T16:13:20.953'),
('181861-0001-001','1ALVW','Open','PRIADA747','2015-07-01T17:49:42.717'),
('181861-0001-001','1ALVW','Closed','PRIADA747','2015-07-01T17:53:28.217'),
('181861-0001-001','1ALVW','Open','PRIADA747','2015-07-01T18:34:11.043'),
('181861-0001-001','1ALVW','Closed','PRIADA747','2015-07-01T19:20:11.540');
GO
SELECT *
FROM #Sample;
GO
WITH Starts AS(
SELECT [KEY],
WORKSTATION,
USERNAME,
[TIMESTAMP],
NULLIF(MIN(ISNULL(CASE STATUS WHEN 'Open' THEN [TIMESTAMP] END,'20550101')) OVER (PARTITION BY [KEY], WORKSTATION, USERNAME),'20550101') AS StartTime
FROM #Sample S)
SELECT [KEY],
WORKSTATION,
USERNAME,
StartTime,
MAX([TIMESTAMP]) AS EndTime,
DATEDIFF(SECOND, StartTime, MAX([TIMESTAMP])) AS Seconds
FROM Starts
GROUP BY [KEY],
WORKSTATION,
USERNAME,
StartTime;
GO
DROP TABLE #Sample;