我尝试发布完整的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
谢谢!
答案 0 :(得分:1)
这是一个使用相关子查询的解决方案,其中一些可以被窗口函数替换(SQL Server的版本在这里有所不同)。
你想改变你的逻辑。等效逻辑是:
以下使用相关子查询计算适当的变量,然后使用简单逻辑组合它们:
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
感谢您的投入和灵感!