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

Откуда:
Сообщений: 2
Доброго дня всем.

Нужна помощь в написании запроса.
Есть таблица логов состояния оборудования, нужно определить интервалы определённого состояния оборудования.

Как пример таблица: Оборудование, Время опроса, Статус
DECLARE @Table Table(Form INTEGER, DateTime DATETIME, Type INTEGER)
INSERT INTO @Table
	VALUES
	(101, '20-01-2018 15:06:56.000',	2),
	(101, '20-01-2018 15:06:58.000',	2),
	(101, '20-01-2018 15:07:00.000',	3),
	(101, '20-01-2018 15:07:02.000',	2),
	(101, '20-01-2018 15:07:04.000',	2),
	(101, '20-01-2018 15:07:06.000',	2),
	(101, '20-01-2018 15:07:08.000',	4),
	(101, '20-01-2018 15:07:10.000',	4),
	(101, '20-01-2018 15:07:12.000',	2),
	(101, '20-01-2018 15:07:14.000',	2),
	(101, '20-01-2018 15:07:16.000',	2),
	(101, '20-01-2018 15:07:18.000',	57),
	(102, '20-01-2018 15:07:20.000',	57),
	(102, '20-01-2018 15:07:22.000',	2),
	(102, '20-01-2018 15:07:24.000',	25),
	(102, '20-01-2018 15:07:26.000',	25),
	(102, '20-01-2018 15:07:28.000',	2),
	(102, '20-01-2018 15:07:30.000',	2),
	(102, '20-01-2018 15:07:32.000',	0),
	(102, '20-01-2018 15:07:34.000',	2)


Ожидаемый результат:
Form DateStart DateEnd Type
101 20-01-2018 15:06:56.00020-01-2018 15:06:58.0002
101 20-01-2018 15:07:00.00020-01-2018 15:07:00.0003
101 20-01-2018 15:07:02.00020-01-2018 15:07:06.0002
101 20-01-2018 15:07:08.00020-01-2018 15:07:10.0004
101 20-01-2018 15:07:12.00020-01-2018 15:07:16.0002
101 20-01-2018 15:07:18.00020-01-2018 15:07:18.00057
102 20-01-2018 15:07:20.00020-01-2018 15:07:20.00057
102 20-01-2018 15:07:22.00020-01-2018 15:07:22.0002
102 20-01-2018 15:07:24.00020-01-2018 15:07:26.00025
102 20-01-2018 15:07:28.00020-01-2018 15:07:30.0002
102 20-01-2018 15:07:32.00020-01-2018 15:07:32.0000
102 20-01-2018 15:07:34.00020-01-2018 15:07:34.0002


Версия сервера: Microsoft SQL Server 2008 R2 (SP3) - 10.50.6220.0 (X64)

Данных много, курсор не хотелось бы использовать.
FAQ просмотрел, похожего ничего не нашёл.
Наверняка задача типовая, буду признателен за пример запроса решения такого типа задач.
19 фев 18, 12:13    [21201404]     Ответить | Цитировать Сообщить модератору
 Re: Интервалы статуса логов состояния  [new]
Добрый Э - Эх
Guest
-Ден-,

STFF
19 фев 18, 12:22    [21201440]     Ответить | Цитировать Сообщить модератору
 Re: Интервалы статуса логов состояния  [new]
-Ден-
Member

Откуда:
Сообщений: 2
Добрый Э - Эх,


Спасибо, не понял сначала как искать на форуме.
В итоге вот что получилось.

DECLARE @Table Table(Form INTEGER, DateTime DATETIME, Type INTEGER)
INSERT INTO @Table
	VALUES
	(101, '20-01-2018 15:06:56.000',	2),
	(101, '20-01-2018 15:06:58.000',	2),
	(101, '20-01-2018 15:07:00.000',	3),
	(101, '20-01-2018 15:07:02.000',	2),
	(101, '20-01-2018 15:07:04.000',	2),
	(101, '20-01-2018 15:07:06.000',	2),
	(101, '20-01-2018 15:07:08.000',	4),
	(101, '20-01-2018 15:07:10.000',	4),
	(101, '20-01-2018 15:07:12.000',	2),
	(101, '20-01-2018 15:07:14.000',	2),
	(101, '20-01-2018 15:07:16.000',	2),
	(101, '20-01-2018 15:07:18.000',	57),
	(102, '20-01-2018 15:07:20.000',	57),
	(102, '20-01-2018 15:07:22.000',	2),
	(102, '20-01-2018 15:07:24.000',	25),
	(102, '20-01-2018 15:07:26.000',	25),
	(102, '20-01-2018 15:07:28.000',	2),
	(102, '20-01-2018 15:07:30.000',	2),
	(102, '20-01-2018 15:07:32.000',	0),
	(102, '20-01-2018 15:07:34.000',	2)
--SELECT * FROM @Table
--SELECT @@VERSION
	SELECT	
		[Form]
		,min([DateTime]) AS DateStart
		,max([DateTime]) AS DateEnd
		,[Type]
	FROM (
         SELECT 
	   *
 	   ,ROW_NUMBER() OVER(PARTITION BY [Form], [Type] ORDER BY [DateTime]) - ROW_NUMBER() OVER(PARTITION BY [Form] ORDER BY [DateTime]) AS grp_id
	   FROM @Table
		) v
	GROUP BY [Form], [Type], grp_id 
	ORDER BY 1,2


На тестовых данных отработало корректно.
Ознакомлюсь с оконными функциями поподробней.
19 фев 18, 12:57    [21201577]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить