2013-07-24 51 views
0

我試圖發佈完整的SQL代碼來引導您完成數據和轉換,但它不會在此處發佈。長話短說,我結束了這樣一個數據表: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 =第一行的方向。

之後,第二行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

請使用標籤來標識SQL Server的版本。此外,不要用單詞問題來描述所需的結果,而要顯示所需的調整後的數據作爲查詢的結果。 –

回答

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

感謝您的意見和靈感!