【问题标题】:Adding a reference data to the table column from different table line从不同的表格行向表格列添加参考数据
【发布时间】: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


【解决方案1】:

查看:

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 要求。

【讨论】:

  • 感谢 Mootinator。我会测试你的方法并告诉你它是如何工作的。
【解决方案2】:

@OMG Ponies:我认为这里的格式会更好一些:

更新 YOUR_TABLE SET time_end = (SELECT TOP 1 t.time_start 从 YOUR_TABLE t 其中 t.DeviceID = YOUR_TABLE.DeviceID AND t.time_start > YOUR_TABLE.time_start 按 t.time_start ASC 排序)

【讨论】:

  • OMG帖子的错误在第一行,然后在SELECT语句中,t.time_start应该大于当前记录的time_start,另外我们需要对记录进行升序排列。
猜你喜欢
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
  • 2017-12-02
  • 1970-01-01
  • 1970-01-01
  • 2017-12-25
  • 1970-01-01
相关资源
最近更新 更多