0

我正在尝试循环我的值,以便我的结果看起来像

       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

这是我循环的条件......,在这里我无法让我的重复值出现在下一行..,任何人都可以帮忙

4

1 回答 1

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

于 2013-07-09T23:29:27.950 回答