我试图循环我的值,以便我的结果看起来像
ETA ETD
01/01/2013 03/01/2013 //Adding Days according to condition, Here 1 day
03/01/2013 06/01/2013 //Add 3 days
06/01/2013 18/01/2013
18/01/2013 21/01/2013
这里我需要循环值,以便在下一行重复我的值
为此我完成了我的工作
CREATE TABLE #TEMPETAETD(ROWNUM INT,ETA DATETIME,ETD DATETIME)
CREATE TABLE #TEMPETD(ID INT IDENTITY(1,1),ETD DATETIME,ROWNUM INT)
CREATE TABLE #TEMPETA(ID INT IDENTITY(1,1),ETA DATETIME,ROWNUM INT)
;WITH cte AS(
SELECT Row_Number() OVER(ORDER BY Sequence)AS RowID,@ETA AS ETA,DATEADD(DD,vd.NumHaltDays,@ETD) as ETD FROM VoyageDetails vd WHERE ID=1 and vd.Sequence BETWEEN 0 AND 1)
INSERT INTO #TEMPETAETD select * from cte
DECLARE @C INT,@C1 INT
SET @C=1
WHILE @C<(SELECT COUNT(*) FROM #TEMPETAETD)
BEGIN
INSERT INTO #TEMPETA SELECT * FROM #TEMPETAETD WHERE ROWNUM=@C
SET @C=@C+1
END
SET @C1=2
WHILE @C1<=(SELECT COUNT(*) FROM #TEMPETAETD)
BEGIN
INSERT INTO #TEMPETD SELECT * FROM #TEMPETAETD WHERE ROWNUM=@C1
SET @C1=@C1+1
END
这是我循环的条件......,在这里我无法让我的重复值出现在下一行..,任何人都可以帮助
答案 0 :(得分:1)
看起来你想要当前行和它之前的行的值。换句话说,您希望能够将一行与前一行配对,然后从该对中选择一些东西。
我认为你不需要循环。循环通常很慢。
一般的想法是,像你一样,对行进行编号。然后你可以用数字加入表格。下面是如何在不使用循环的情况下进行此配对的示例。架构:
create table T (a int);
insert into T values
(1), (7), (20), (30), (500), (800), (1300), (2112);
查询:
with tNumbered as (
select row_number() over (order by a) as rowID, a
from T
)
select tLeft.a as l, tRight.a as r from tNumbered tLeft
left join tNumbered tRight on tLeft.rowID = tRight.rowID -1
这是一个小提琴,展示了它的实际效果:http://sqlfiddle.com/#!3/a257a/2