SQL游标超过类别?

时间:2013-07-24 18:59:11

标签: sql-server sql-server-2008-r2

我尝试发布完整的SQL代码来引导您完成数据和转换,但它不会发布到此处。长话短说,我最终得到了这样一个数据表:

Location  Date                     Direction  PreviousDirection  Offset
site1     2013-07-22 11:30:45.000   302        302                0
site1     2013-07-22 11:31:45.000   322        302               20
site1     2013-07-22 11:32:45.000     9        322               47
site1     2013-07-22 11:33:45.000     9          9                0
site1     2013-07-22 11:34:45.000     0          9               -9
site2     2013-07-22 11:30:45.000   326        326                0
site2     2013-07-22 11:31:45.000     2        326               36
site2     2013-07-22 11:32:45.000     2          2                0
site2     2013-07-22 11:33:45.000     2          2                0
site2     2013-07-22 11:34:45.000     2          2                0

位置,日期是主键。我需要帮助生成[AdjustedDirection]列,计算如下:

对于第一行(对于每个位置,例如site1,site2):由于没有要计算的上一行,AdjustedDirection =第一行的Direction。

之后,第二行AdjustedDirection:它是第一行的AdjustedDirection加上第二行的偏移量。 第三行AdjustedDirection:它是第二行的AdjustedDirection加上第三行的偏移量。 等等...

我认为这需要一个游标,但我不知道在多个类别(位置)上执行游标的语法和/或可能有不同的答案。我无法描述进入此步骤的过程有多少步骤和复杂程度。我已经接近尾声,完全停留在这里!

如果有人知道如何填充这些AdjustedDirection值,请证明你的精彩。谢谢!

结果应该如下所示(为了显示当前行调整的计算方式,显示了间距的截断日期,之前调整的方向):

Location  Date        Direction  Offset   PrevAdjDirection  AdjustedDirection
site1     11:30:45.000   302          0         302              302
site1     11:31:45.000   322         20         302              322
site1     11:32:45.000     9         47         322              369
site1     11:33:45.000     9          0         369              369
site1     11:34:45.000     0         -9         369              360
site2     11:30:45.000   326          0         326              326
site2     11:31:45.000     2         36         326              362
site2     11:32:45.000     2          2         362              362
site2     11:33:45.000     2          2         362              362
site2     11:34:45.000     2          2         362              362

谢谢!

2 个答案:

答案 0 :(得分:1)

这是一个使用相关子查询的解决方案,其中一些可以被窗口函数替换(SQL Server的版本在这里有所不同)。

你想改变你的逻辑。等效逻辑是:

  1. 对于第一行,请使用Direction
  2. 对于后续行,请使用除第一个偏移量和第一行中的方向之外的偏移量的累积和。
  3. 以下使用相关子查询计算适当的变量,然后使用简单逻辑组合它们:

    select t.*,
           FirstOffset + coalesce(SumEarlierOffsets - FirstOffset + Offset, 0) as AdjustedOffset
    from (select t.*,
                 (select Direction
                  from t t2
                  where t2.location = t.location
                  order by date asc
                 ) as FirstDirection,
                 (select SUM(offset)
                  from t t2
                  where t2.location = t.location and
                        t2.date < t.date
                 ) as SumEarlierOffsets,
                 (select Offset
                  from t t2
                  where t2.location = t.location
                  order by date asc
                 ) as FirstOffset
          from t
         ) t
    

答案 1 :(得分:0)

我最终将当前数据转储到临时表中并像这样执行WHILE UPDATE

SELECT Location, Date, Direction, Offset, Adjusted = NULL
INTO #results
FROM t1

WHILE (
SELECT COUNT(*) FROM #results WHERE Adjusted IS NULL
) > 0
UPDATE TOP (1) t1
 SET Adjusted = ISNULL(t2.Adjusted,ISNULL(t2.Direction,t1.Direction)) + t1.Offset
 FROM #results t1 
 LEFT JOIN #results t2 ON t2.Location = t1.Location AND t2.Date =     DateAdd(minute,-1,t1.Date)
WHERE t1.Adjusted IS NULL

感谢您的投入和灵感!