Предполагается, что SQL Server 2005 +
DECLARE @T TABLE (
id INT PRIMARY KEY,
val CHAR(1))
INSERT INTO @T
SELECT 1,'A' UNION ALL SELECT 2,'A' UNION ALL
SELECT 3,'B' UNION ALL SELECT 4,'B' UNION ALL
SELECT 5,'A' UNION ALL SELECT 6,'A'
;WITH cte1 AS(
SELECT
id,
val,
ROW_NUMBER() OVER (ORDER BY id) - ROW_NUMBER() OVER (PARTITION BY val ORDER BY id) AS Grp
FROM @T
),
cte2 AS(
SELECT
id,
val,
MIN(id) OVER (PARTITION BY Grp, val) AS GrpStart
FROM cte1
)
SELECT
id,
val,
DENSE_RANK() OVER (ORDER BY GrpStart) AS segment
FROM cte2
Или обновленное требование немного проще
;WITH cte AS(
SELECT
id,
val,
ROW_NUMBER() OVER (ORDER BY id) - ROW_NUMBER() OVER (PARTITION BY val ORDER BY id) AS Grp
FROM @T
)
SELECT
val,
MIN(id) AS from_id,
MAX(id) AS to_id
FROM cte
GROUP BY Grp, val
ORDER BY from_id