【发布时间】:2010-10-31 19:06:16
【问题描述】:
我有一个包含以下列的事件表:
- 序列(整数)
- 设备 ID (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_start 数据更新 time_end。 有了这个,我就可以跟踪每个事件的时间段。
我正在考虑通过函数调用来做到这一点,但我有两个主要困难: 1.从例如:sequence=2获取数据并更新sequence=1的time_end 2. 创建一个函数,当新记录添加到表中时,该函数将持续执行此操作
我对 SQL 还很陌生,而且我对还有什么可能的东西很迷茫。根据我的知识,我应该使用将数据一起引用的函数,但我目前的知识限制了我这样做。
我希望有人可以指导我前进的方向,并在我是否走在正确的轨道上时向我提供一些反馈。非常感谢任何支持文章。
【问题讨论】:
-
对于什么版本的 SQL Server?如果 time_end 将始终是之前的 time_start,为什么要记录它 - 这是您可以通过选择 time_start 作为 deviceid 并按 time_start 值排序来获得的冗余数据...
-
添加到 OMG Ponies 的建议中,如果您打算经常使用它而避免一遍又一遍地编写该逻辑,您可以创建一个视图。
-
我正在考虑创建一个视图,但没有任何成功。我能够为选定的 DeviceID 创建一个视图并按时间戳对其进行排序,但是对于每个条目,我都需要拥有我目前没有的 time_end 数据(阅读:我无法从两个不同的记录中读取它)。
标签: sql sql-server tsql sql-server-2008