SQL循环下一列的重复值?

时间:2013-07-09 09:59:35

标签: sql sql-server-2008 while-loop

我试图循环我的值,以便我的结果看起来像

       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

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

1 个答案:

答案 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