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

Откуда: Ижевск
Сообщений: 59
Имеем данные из следующего запроса:
select EdocID, Version, UserID, ActionType, ActionDate from SBEDocProtocol where ActionType in ('E', 'R') order by EDocID, ActionDate


следующие данные (малая часть):
103115 2 147892 R 2017-04-27 15:47:04.000
103120 1 103576 E 2003-09-10 15:01:00.000
103120 1 103576 R 2003-09-10 16:25:00.000

Как можно найти данные по такому условию:
В рамках одного EdocID, Version, UserID найти данные, где между соседствующими ActionType = E и R (именно в такой последовательности) ActionDate составляет порядка до 3 секунд. Т.е. фактически нужно найти документы, которые изменялись (E) и в течении до трех секунд сразу же открывались (R) в рамках одного документа, одной версии и одним пользователем.
Как я понимаю тут явно нужно идти курсором, но чтот залип.

Т.е. нужно получить например такие данные.

103120 1 103576 E 2003-09-10 15:01:00.000
103120 1 103576 R 2003-09-10 15:01:03.000
3 май 17, 09:35    [20452114]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в запросе  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20482
Что-то типа
SELECT ...
FROM SBEDocProtocol t1, SBEDocProtocol t2
WHERE t1.EdocID = t2.EdocID 
  AND t1.Version = t2.Version
  AND t1.UserID = t2.UserID
  AND t1.ActionType = 'E'
  AND t2.ActionType = 'R'
  AND DATEDIFF('s', t1.ActionDate, t2.ActionDate) BETWEEN 0 AND 3
3 май 17, 09:53    [20452183]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в запросе  [new]
invm
Member

Откуда: Москва
Сообщений: 9263
with a as
(
 select
  EdocID, Version, UserID, ActionType, ActionDate,
  lead(ActionType) over (partition by EdocID, Version, UserID order by ActionDate) as NextActionType,
  lead(ActionDate) over (partition by EdocID, Version, UserID order by ActionDate) as NextActionDate
 from
  SBEDocProtocol
)
select
 EdocID, Version, UserID, ActionType, ActionDate
from
 a
where
 ActionType = 'E' and NextActionType = 'R' and
 datediff(ss, ActionDate, NextActionDate) <= 3
order by
 EDocID, ActionDate;
3 май 17, 10:16    [20452283]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в запросе  [new]
Jhonny-2005
Member

Откуда: Ижевск
Сообщений: 59
invm,

Круто, благодарю, как раз то, что было нужно.
3 май 17, 11:24    [20452517]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить