【发布时间】:2017-10-24 16:04:03
【问题描述】:
我无法为问题引用正确的图块。
下面是我的桌子。
预期输出:带有 ID 和 SequenceNo 列。无法上传图片。
ID Act SequenceNo1
1 1 1
2 2 NULL
3 3 NULL
4 4 NULL
5 1 5
6 2 NULL
7 3 NULL
8 4 NULL
9 5 NULL
10 6 NULL
11 5 11
12 6 NULL
13 1 13
14 2 NULL
15 3 NULL
16 4 NULL
17 5 NULL
18 6 NULL
19 1 19
20 2 NULL
21 3 NULL
22 4 NULL
23 5 NULL
24 6 NULL
在开头最后一列SequenceNo 为NULL。`
我的要求是每当启动新系列的Act 列时,将ID 列的值更新为SequenceNo 列。
Act 列的值是 1 到 6。Act 中可能缺少从 1 到 6 的任何数字。
示例 1:ID 1 到 4 - Act 是正确的,但在下一行 (ID=5) Act 重新启动。因此需要更新SequenceNo 列。
示例 2:ID 5 到 10 是正确的。但下一行 (ID=11;Act=5) 有新序列,因此需要更新 SequenceNo 列。
CREATE TABLE #tmp
(
ID int
, ScheduleID varchar(50)
,DCNumber VARCHAR(50)
, BuildingID varchar(10)
, StoreNumber int
, [DayOfWeek] int
, [Tm] varchar(10)
,[Act] int
, SequenceNo int
)
INSERT INTO #tmp SELECT 1,'WAS',9003,900301,254,1,'00:00',1,NULL
INSERT INTO #tmp SELECT 2,'WAS',9003,900301,254,1,'00:00',2,NULL
INSERT INTO #tmp SELECT 3,'WAS',9003,900301,254,1,'00:00',3,NULL
INSERT INTO #tmp SELECT 4,'WAS',9003,900301,254,1,'00:00',4,NULL
INSERT INTO #tmp SELECT 5,'WAS',9003,900301,254,2,'00:00',1,NULL
INSERT INTO #tmp SELECT 6,'WAS',9003,900301,254,2,'00:00',2,NULL
INSERT INTO #tmp SELECT 7,'WAS',9003,900301,254,2,'00:00',3,NULL
INSERT INTO #tmp SELECT 8,'WAS',9003,900301,254,2,'00:00',4,NULL
INSERT INTO #tmp SELECT 9,'WAS',9003,900301,254,2,'00:00',5,NULL
INSERT INTO #tmp SELECT 10,'WAS',9003,900301,254,2,'00:00',6,NULL
INSERT INTO #tmp SELECT 11,'WAS',9003,900301,254,3,'00:00',5,NULL
INSERT INTO #tmp SELECT 12,'WAS',9003,900301,254,3,'00:00',6,NULL
INSERT INTO #tmp SELECT 13,'WAS',9003,900301,254,4,'00:00',1,NULL
INSERT INTO #tmp SELECT 14,'WAS',9003,900301,254,4,'00:00',2,NULL
INSERT INTO #tmp SELECT 15,'WAS',9003,900301,254,4,'00:00',3,NULL
INSERT INTO #tmp SELECT 16,'WAS',9003,900301,254,4,'00:00',4,NULL
INSERT INTO #tmp SELECT 17,'WAS',9003,900301,254,5,'00:00',5,NULL
INSERT INTO #tmp SELECT 18,'WAS',9003,900301,254,5,'00:00',6,NULL
INSERT INTO #tmp SELECT 19,'WAS',9003,900301,254,6,'00:00',1,NULL
INSERT INTO #tmp SELECT 20,'WAS',9003,900301,254,6,'00:00',2,NULL
INSERT INTO #tmp SELECT 21,'WAS',9003,900301,254,6,'00:00',3,NULL
INSERT INTO #tmp SELECT 22,'WAS',9003,900301,254,6,'00:00',4,NULL
INSERT INTO #tmp SELECT 23,'WAS',9003,900301,254,7,'00:00',5,NULL
INSERT INTO #tmp SELECT 24,'WAS',9003,900301,254,7,'00:00',6,NULL
我已经构建了一个逻辑,但这很耗时。
DECLARE @Act INT, @iStart INT, @iMax INT, @iFirst INT
SET @iFirst = 7
SET @iMax = (SELECT MAX(ID) FROM #tmp)
SET @iStart = 1
WHILE(@iStart <= @iMax)
BEGIN
SET @Act = (SELECT Act FROM #tmp WHERE ID = @iStart)
IF(@iFirst > @Act )
BEGIN
UPDATE #tmp SET SequenceNo = @iStart WHERE ID = @iStart
END
SET @iFirst = @Act
SET @iStart = @iStart + 1
END
我正在寻找任何替代的优化解决方案。
【问题讨论】:
-
MySQL 是一个不同的 rdbms 产品,它与 ms sql server 无关。请仅在您的问题中使用相关的产品标签。
-
您使用的是什么版本的 sql server?另外,您能否编辑您的问题以将示例数据添加为 DDL+DML?
-
SQL Server 2012 具有排名和窗口函数,如 ROW_NUMBER、RANK、LEAD、LAG 等,这使得该查询变得微不足道。它也是最早支持的 SQL Server 版本。在以前的版本中,有有种方法可以检测没有循环的序列中的中断,尽管它们更难编写。也许您应该迁移到受支持的服务器版本?例如,在序列中找到一个中断只需要找到
Act - LAG(Act,1)不同于 1 的行 -
@PanagiotisKanavos - 谢谢。但我有 Microsoft SQL Server 2008 (SP3) - 10.0.5520.0 (X64) 版本。还有其他帮助吗?
标签: sql-server sql-server-2008 while-loop