Предполагая, что ваш столбец «datetime» всегда имеет формат t_{int}
, вы можете использовать STUFF
, чтобы удалить первые 2 символа, а затем преобразовать это значение в int
. Это позволяет вам упорядочить их численно, а не лексикографически. Затем вы можете получить MIN
и MAX
с решением для пробелов и островов и прочитать префикс t_
:
WITH YourTable AS(
SELECT *
FROM (VALUES('t_1',4),
('t_3',5),
('t_4',5),
('t_5',5),
('t_6',7),
('t_7',7),
('t_8',7),
('t_9',4),
('t_10',4),
('t_11',4))V(date_time,toolid)),
CTE AS(
SELECT YT.date_time,
YT.toolid,
V.time_int,
ROW_NUMBER() OVER (ORDER BY V.time_int) -
ROW_NUMBER() OVER (PARTITION BY YT.toolid ORDER BY V.time_int) AS Grp
FROM YourTable YT
CROSS APPLY(VALUES(TRY_CONVERT(int,STUFF(date_time,1,2,''))))V(time_int))
SELECT C.toolid,
CONCAT('t_',MIN(C.time_int)) AS From_date_time,
CONCAT('t_',MAX(C.time_int)) AS To_date_time
FROM CTE C
GROUP BY C.toolid,
C.Grp;
Изменить: непроверено, но на основе полностью измененного образца OP data это теперь просто проблема с пробелами и островком:
WITH CTE AS(
SELECT YT.date_time,
YT.toolid,
ROW_NUMBER() OVER (ORDER BY YT.date_time) -
ROW_NUMBER() OVER (PARTITION BY YT.toolid ORDER BY YT.date_time) AS Grp
FROM dbo.YourTable YT)
SELECT C.toolid,
MIN(C.date_time) AS From_date_time,
MAX(C.date_time) AS To_date_time
FROM CTE C
GROUP BY C.toolid,
C.Grp;