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

Откуда: Москва
Сообщений: 16
Есть таблица условная:
create table TableName(user_id varchar(250), date_action datetime, action_from datetime, action_by datetime)


получаем данные на некую дату по конкретному юзеру:

user_id | date_action | action_from | action_by
Вано |10.02.2018 | 10:00 | 12:00
Вано |10.02.2018 | 15:00 | 16:00
Вано |10.02.2018 | 18:00 | 20:00

можно ли запросом вычислить промежутки времени между action_by и action_from соседних записей, чтобы получить следующее:

user_id | date_action | action_from | action_by | freedom_from_action
Вано |10.02.2018 | 10:00 | 12:00 | 08:00-10:00
Вано |10.02.2018 | 15:00 | 16:00 | 12:00-15:00
Вано |10.02.2018 | 18:00 | 20:00 | 16:00-18:00

время 08:00 - константа.
21 фев 18, 07:17    [21206703]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление временных промежутков.  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Рихтовщик,

Что-то похожее было
21 фев 18, 07:29    [21206715]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление временных промежутков.  [new]
Добрый Э - Эх
Guest
Рихтовщик,

в зависимости от версии сервера:
1) [LEAD | LAG] over()
2) [CROSS | OUTER] APPLY(SELECT TOP(1) ...)
3) Коррелированный скалярный TOP (1) ползапрос в SELECT-листе
21 фев 18, 07:31    [21206718]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление временных промежутков.  [new]
Kopelly
Member

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

Блин - опять я усложняю...
21 фев 18, 07:35    [21206721]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление временных промежутков.  [new]
Рихтовщик
Member

Откуда: Москва
Сообщений: 16
версия 2012
21 фев 18, 07:36    [21206723]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление временных промежутков.  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Рихтовщик,

Select *,isnull(LEAD(action_by) Over (Partition by user_id, date_action Order by action_by),'8-00') as Prev_Action_By From TableName
21 фев 18, 07:42    [21206733]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление временных промежутков.  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Kopelly, спешишь...

Select *,isnull(LAG(action_by) Over (Partition by user_id, date_action Order by action_by),'8:00') as Prev_Action_By From @TableName
21 фев 18, 07:47    [21206744]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление временных промежутков.  [new]
Рихтовщик
Member

Откуда: Москва
Сообщений: 16
Kopelly,

спасибо, а можно как-то дополнительно обработать именно последнюю строку?
я добавил в запрос row_number() over(order by action_from), получил порядковые номера, можно как-то это использовать?
21 фев 18, 14:17    [21208108]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление временных промежутков.  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Kopelly,
смотри, что 2012 умеет:
SELECT 
  *,
  [Prev_Action_By] = LAG( [action_by], 1, '8:00' ) OVER ( PARTITION BY [user_id], [date_action] ORDER BY [action_by] )
FROM
  @TableName
21 фев 18, 20:11    [21209594]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление временных промежутков.  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Рихтовщик
Kopelly,

спасибо, а можно как-то дополнительно обработать именно последнюю строку?
я добавил в запрос row_number() over(order by action_from), получил порядковые номера, можно как-то это использовать?


Case When row_number() over(order by action_from) = count(*) over() Then [Обработка] Else NULL end
22 фев 18, 04:21    [21210096]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление временных промежутков.  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Рихтовщик,

При необходимости добавляешь в оба Over () выражение Partition By
22 фев 18, 04:22    [21210097]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление временных промежутков.  [new]
Рихтовщик
Member

Откуда: Москва
Сообщений: 16
Kopelly,

круто, спасибо.
где бы про эти оконные функции почитать, чтобы разжевано было?
22 фев 18, 06:25    [21210118]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить