Estoy empezando a aprender acerca del bucle. Tengo códigos de muestra, pero lamentablemente puedo manipular el bucle while.
Necesito leer todo el valor en la columna Estado donde puedo ordenar esto en Primera A y hasta la Última B.
TABLE
ID Time Status
12 2018-05-04 08:00:00 A
12 2018-05-04 09:00:00 A
12 2018-05-04 11:00:00 B
12 2018-05-04 13:00:00 A
12 2018-05-04 15:00:00 B
12 2018-05-04 18:00:00 B
La única forma de detectar todo valor es usar mientras que el bucle son mis códigos de muestra
DECLARE @rc tinyint
SET @rc = @@ROWCOUNT
BEGIN
WHILE (@rc <= 1)
BEGIN
If (@in = "A")
BEGIN
WITH Param As (Select * FROM Table WHERE Status="A")
SELECT MAX(Status) FROM Param
END
END
END
Esta imagen muestra el valor que debe mostrar
OUTPUT
ID Time Status
12 2018-05-04 08:00:00 A
12 2018-05-04 11:00:00 B
12 2018-05-04 13:00:00 A
12 2018-05-04 18:00:00 B
¿Me puede ayudar por favor? Es realmente difícil tener un bucle infinito
Respuestas
1 para la respuesta № 1Tenga en cuenta que el uso de while loop no será una buena opción para este tipo de consultas. Será caro.
No necesitas un while
bucle para lograr esto, se puede hacer de maneras más simples como usar un UNION
y ROW_NUMBER()
como siguiendo
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
EDITAR:
Como ha mencionado, tiene una columna de fecha para ordenar los datos. Para este escenario puedes usar LAG
en SQL Server
SELECT Id,Status FROM
(
SELECT *, LAG(Status) OVER(ORDER BY [Date]) NextStatus FROM [TableName]
) T
WHERE Status <> NextStatus OR NextStatus IS NULL
EDIT 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