Используйте цикл while для чтения значения строк в хранимой процедуре - PullRequest
0 голосов
/ 17 мая 2018

Я начинаю изучать циклы.У меня есть примеры кодов, но, к сожалению, я могу манипулировать циклом while.

Нужно прочитать все значения в столбце Status, где я могу отсортировать это в первом A и последнем 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

Единственный способ обнаружить все значения - использовать цикл whileэто мои примеры кодов

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

Это изображение показывает, что значение должно отображаться

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

Можете ли вы мне помочь?Это действительно тяжело, так как бесконечный цикл

1 Ответ

0 голосов
/ 17 мая 2018

Обратите внимание, что использование цикла 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...