Обратите внимание, что использование цикла while не будет хорошим выбором для запросов такого типа. Это будет дорого.
Вам не нужен цикл while
, чтобы достичь этого, это можно сделать более простыми способами, такими как UNION
и ROW_NUMBER()
, например, следующим образом.
SELECT Id,Status FROM
(
SELECT *, ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) RN FROM [Table] WHERE Status='A'
UNION
SELECT *, ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) RN FROM [Table] WHERE Status='B'
)T ORDER BY RN
DEMO
EDIT:
Как вы упомянули, у вас есть столбец даты, чтобы упорядочить данные. Для этого сценария вы можете использовать LAG
в SQL Server
SELECT Id,Status FROM
(
SELECT *, LAG(Status) OVER(ORDER BY [Date]) NextStatus FROM [TableName]
) T
WHERE Status <> NextStatus OR NextStatus IS NULL
DEMO
РЕДАКТИРОВАТЬ 2: SQL Server 2005
SELECT Id,Status FROM
(
SELECT *,
(
SELECT TOP 1 Status FROM [TableName] t2 WHERE t2.[Date] < t.Date ORDER BY DATE desc
) AS NextStatus
FROM [TableName] t
) T
WHERE t.Status <> NextStatus OR NextStatus IS NULL
DEMO