2010-10-31 51 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

相关问题