我开始学习循环了。我有示例代码,但遗憾的是我可以操作while循环。
需要读取列状态的所有值,我可以在第一个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
This image show the value should display
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
请帮帮我吗?它真的越来越难有无限循环
答案 0 :(得分:1)
请注意,对于这些类型的查询,使用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 强>
修改强>
正如您所提到的,您有日期列来订购数据。对于此方案,您可以在SQL Server中使用LAG
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 强>