2010-10-31 52 views
2

我有一個事件表與下列:(添加引用數據從不同的表線表列

  • 序列(INT)
  • 的DeviceID(VARCHAR(8))
  • TIME_START日期時間)
  • DeviceState(SMALLINT)
  • TIME_END(日期時間)

除time_end以外的所有列均填充了數據(我的當前time_end列在表格中爲NULL)。我需要做的是用事件關閉數據填充time_end列。這實際上是來自同一設備的新事件發生的時間。 下面是一個例子的數據模型,它應該如何在工作進行到底:

sequence  DeviceID   time_start   DeviceState  time_end 
-------------------------------------------------------------------------------------- 
1   000012A7   2010-10-31 12:00  14    2010-10-31 12:10 
2   000012A7   2010-10-31 12:10  18    2010-10-31 12:33 
3   000012A8   2010-10-31 12:20  16    2010-10-31 13:01 
4   000012A7   2010-10-31 12:33  13    2010-10-31 12:47 
5   000012A7   2010-10-31 12:47  18    2010-10-31 13:20 
6   000012A8   2010-10-31 13:01  20    2010-10-31 13:23 
7   000012A7   2010-10-31 13:20  05    2010-10-31 14:12 
8   000012A8   2010-10-31 13:23  32    2010-10-31 14:15 
9   000012A7   2010-10-31 14:12  12 
10   000012A8   2010-10-31 14:15  35 

的想法是,爲表中的每個記錄,我需要對特定的設備更高的序列中選擇一個記錄並更新與TIME_END該更高級別記錄的time_start數據。 有了這個,我可以跟蹤每個事件的時間段。

我想與一個函數調用這樣做,但我有兩個主要困難: 1.得到從例如數據:序列= 2和更新順序= 1 2的TIME_END創建函數這將隨着新記錄被添加到表中,不斷做這件事

我對SQL很陌生,我對其他可能的東西感到迷茫。基於我的知識,我應該使用可以將數據一起引用的功能,但是我目前的知識限制了我這樣做。

我希望有人能爲我提供一些指導,指導我走向哪個方向,如果我走在正確的軌道上,我會提供一些反饋意見。任何支持文章將非常感激。

+1

對於哪個版本的SQL Server?如果time_end始終是前一個time_start,那麼爲什麼記錄它 - 這是通過爲deviceid選擇time_start並通過time_start值排序可以獲得的冗餘數據... – 2010-10-31 19:12:06

+0

要添加OMG Ponies建議的內容,如果它是避免反覆編寫邏輯的問題,因爲你計劃經常使用它,你可以創建一個視圖。 – 2010-10-31 19:18:45

+0

@OMG小馬:SQL服務器2008 – Mark 2010-10-31 19:30:50

回答

0

查看:

CREATE VIEW tableview AS 
with timerank AS 
(
SELECT mytable.*, ROW_NUMBER() OVER (PARTITION BY DeviceID ORDER BY time_start) as row 
FROM THE_TABLE mytable 
) 
SELECT tstart.*, tend.time_start AS time_end 
FROM timerank tstart 
    LEFT JOIN timerank tend ON tstart.row = tend.row - 1 
    AND tstart.DeviceID = tend.DeviceID 

編輯:我現在看到你的設備ID的要求。

+0

感謝Mootinator。我會測試你的方法,並讓你知道它是如何工作的。 – Mark 2010-10-31 20:39:27

0

@OMG小馬:我認爲這裏將是一個好一點的格式:

UPDATE YOUR_TABLE SET TIME_END =(SELECT TOP 1 t.time_start FROM YOUR_TABLE牛逼 WHERE t.DeviceID = YOUR_TABLE.DeviceID AND t.time_start> YOUR_TABLE.time_start ORDER BY t.time_start ASC)

+0

OMG帖子中的錯誤是在第一行,然後在SELECT語句中,t.time_start應該大於當前記錄的time_start,另外我們需要按升序格式排序記錄。 – Mark 2010-10-31 20:38:56