2010-10-31 3 views
2

У меня есть таблица событий со следующими столбцами:Добавление справочных данных в столбец таблицы из другой строки таблицы

  • последовательность (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_end с данные time_start этой записи более высокого уровня. С этим я смогу отслеживать период времени каждого события.

Я думал об этом с вызовом функции, но у меня есть две основные трудности: 1. Получение данных из, например: последовательность = 2 и обновление time_end последовательности = 1 2. создать функцию, которая будет делайте это непрерывно по мере добавления новых записей в таблицу

Я довольно новичок в SQL, и я совершенно потерял то, что еще возможно. Основываясь на моих знаниях, я должен использовать функцию, которая будет связывать данные вместе, но мои текущие знания ограничивают меня этим.

Я надеюсь, что кто-то может предоставить мне некоторое руководство, в какое направление идти, и предоставить мне некоторую обратную связь, если я на правильном пути или нет. Любые вспомогательные статьи будут очень оценены.

+1

Для какой версии SQL Server? Если time_end всегда будет прежним time_start, зачем вообще его записывать - это избыточные данные, которые вы могли бы получить, выбрав time_start для deviceid и order by time_start value ... –

+0

Чтобы добавить к тому, что предложил OMG Ponies, если это вопрос об избежании написания этой логики снова и снова, потому что вы планируете часто ее использовать, вы можете создать представление. –

+0

@OMG Ponies: SQL server 2008 – Mark

ответ

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 

Edit: Я вижу ваше требование DeviceId в настоящее время.

+0

спасибо Mootinator.Я проверю ваш метод и дам вам знать, как он работает. – Mark

0

@OMG Ponies: Я думаю, что здесь будет немного лучше форматирования:

UPDATE YOUR_TABLE SET time_end = (SELECT TOP 1 t.time_start ОТ YOUR_TABLE т WHERE t.DeviceID = YOUR_TABLE.DeviceID И t.time_start> YOUR_TABLE.time_start ORDER BY t.time_start ASC)

+0

Ошибка в сообщении OMG была в первой строке, а затем во время инструкции SELECT t.time_start должен быть больше, чем time_start текущей записи, кроме того, нам нужно заказать записи в восходящем формате. – Mark