0

我试图发布完整的 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

Location,Date 是主键。我需要帮助生成 [AdjustedDirection] 列,计算如下:

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

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

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

如果有人知道如何填充这些 AdjustedDirection 值,请证明您的出色。谢谢!!

结果应如下所示(为间距截断日期,显示先前调整的方向,以便清楚地计算当前行 Adjusted 的计算方式):

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

谢谢!

4

2 回答 2

1

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

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

  1. 对于第一行,使用方向
  2. 对于后续行,使用不包括第一个偏移量的偏移量的累积总和加上第一行的方向。

下面使用相关子查询计算适当的变量,然后使用简单的逻辑将它们组合起来:

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
于 2013-07-24T19:32:42.500 回答
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

感谢您的输入和启发!

于 2013-07-25T15:08:08.923 回答