从不同的表行向表列添加引用数据

时间:2010-10-31 19:06:17

标签: sql sql-server tsql sql-server-2008

我有一个包含以下列的事件表:

  • sequence(int)
  • DeviceID(varchar(8))
  • time_start(datetime)
  • DeviceState(smallint)
  • time_end(datetime)

除了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_start数据更新time_end。 有了这个,我将能够跟踪每个事件的时间段。

我正在考虑用函数调用来做这件事,但我有两个主要困难: 1.从例如:sequence = 2获取数据并更新sequence = 1的time_end 2.创建一个函数,当新记录添加到表中时,它将连续执行此操作

我对SQL很陌生,我很遗憾还有其他可能的东西。根据我的知识,我应该使用将数据引用到一起的函数,但是我目前的知识限制了我这样做。

我希望有人可以向我提供一些指导,指导我走哪条路,如果我走在正确的轨道上,可以给我一些反馈。非常感谢任何支持文章。

2 个答案:

答案 0 :(得分: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

编辑:我现在看到你的deviceID要求了。

答案 1 :(得分:0)

@OMG小马:我想这里的格式会更好一些:

更新你的时间    SET time_end =(选择TOP 1                           t.time_start                      来自你的时间                     WHERE.DeviceID = YOUR_TABLE.DeviceID                       AND t.time_start> YOUR_TABLE.time_start                  ORDER BY t.time_start ASC)