Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как отобрать записи с заданным интервалом времени между ними?  [new]
WildMax
Member

Откуда: Москва
Сообщений: 162
Есть некая таблица лога, примерно такая
CREATE TABLE T_SysLog 
       (ID_Event int IDENTITY (1, 1) NOT NULL ,
	Event datetime NOT NULL ,
	EventString varchar (255),
CONSTRAINT [PK__T_SysLog__000AF8CF] PRIMARY KEY  CLUSTERED 
	(ID_Event))

в нее в общем случае вносятся данные о работе системы. Соответственно, если система простаивает, то данные не вносятся. В поле Event как раз и хранится время вноса текущей записи. Требуется узнать, когда система простаивала, к примеру, больше часа. Т.е. нужно отобрать записи, у которых разница интервалов между текущей и следующей превышает час. Сложность еще и в том, что в таблице несколько десятков миллионов записей. Я попытался сходу написать запрос, он не отработал за 3 дня.
18 июл 11, 16:03    [10990221]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи с заданным интервалом времени между ними?  [new]
aleks2
Guest
Ну дык, пронумеруйте записи последовательно и будет вам щастье.
18 июл 11, 16:20    [10990337]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи с заданным интервалом времени между ними?  [new]
flexgen
Member

Откуда: Город на песке
Сообщений: 852
aleks2,

Записи там и так нумеруются:
ID_Event int IDENTITY (1, 1) NOT NULL



WildMax,

автор
Я попытался сходу написать запрос, он не отработал за 3 дня.


Пытался завязать таблицу саму на себя? Если судить по этому:
нужно отобрать записи, у которых разница интервалов между текущей и следующей превышает час.


то возможны либо построчный перебор (плохая идея) либо такое:
Взять минимальное и максимальное значения поля Event. Сгенерировать все возможные значения между минимальным и максимальным значениями и занести их во временную таблицу, скажем для каждой секунды генерируем запись. Связать left join-ом временную таблицу с таблицей T_SysLog по полю Event , все те записи, в которых значение поля Event будет Null и есть твое время простоя. Лучше брать какой-то отрезок времени а не всю таблицу, плюс не помешало бы разбить таблицу T_SysLog на partitions по дате, скажем для каждого дня свой partition. Конечно же возможны другие варианты но они мне в голову не пришли :-).
18 июл 11, 23:00    [10992266]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи с заданным интервалом времени между ними?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
flexgen
Записи там и так нумеруются:
ID_Event int IDENTITY (1, 1) NOT NULL
Если удалений нет, то просто
select * from T_SysLog t1 join T_SysLog t2 on t2.id = t1.id-1 and datediff(mi, t1.Event, t2.Event) > 60
18 июл 11, 23:56    [10992360]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить