powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Просьба помочь с пересечением времен
6 сообщений из 6, страница 1 из 1
Просьба помочь с пересечением времен
    #39980623
An111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Просьба помочь с решением следующей проблемы - в табличке есть пользователи и время начала/окончания их работы.

Нужно в случае пересечения времени в разных строках пользователя во время окончания предыдущей работы прописать время следующей.

Как это можно сделать наиболее оптимальным способом, без курсоров, конечно?

Простейший пример таблицы с такими данными:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
DECLARE @tb TABLE(SessionID int, UserName sysname, StartSession datetime, EndSession datetime)

INSERT INTO @tb (SessionID, UserName, StartSession, EndSession) VALUES
	(1, 'Сидоров', '2020-07-16 12:30:12', '20200716 22:30:00'),
	(2, 'Попов', '2020-07-16 14:10:00', '20200716 17:00:10'),
	(3, 'Сидоров', '2020-07-16 14:20:00', '20200716 23:15:17'),
	(4, 'Попов', '2020-07-16 18:00:00', '20200716 19:00:00'),
	(5, 'Сидоров', '2020-07-16 20:10:00', '20200716 23:44:17'),
	(6, 'Сидоров', '2020-07-16 23:10:00', '20200716 23:45:17'),
	(7, 'Сидоров', '2020-07-16 23:45:30', '20200716 23:50:00')

SELECT * FROM @tb
...
Рейтинг: 0 / 0
Просьба помочь с пересечением времен
    #39980628
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если там несколько записей "пересекаются", да еще как-нибудь по-хитрому?

Код: sql
1.
2.
3.
Сидоров   +---------------------+
Сидоров              +-------------------+
Сидоров        +-------------+
...
Рейтинг: 0 / 0
Просьба помочь с пересечением времен
    #39980632
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
An111
Нужно в случае пересечения времени в разных строках пользователя во время окончания предыдущей работы прописать время следующей.
А если следующих несколько?
...
Рейтинг: 0 / 0
Просьба помочь с пересечением времен
    #39980637
An111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat
А если там несколько записей "пересекаются", да еще как-нибудь по-хитрому?

Код: sql
1.
2.
3.
Сидоров   +---------------------+
Сидоров              +-------------------+
Сидоров        +-------------+



Тогда должно быть так:

Код: sql
1.
2.
3.
Сидоров   +----+
Сидоров              +-------------------+
Сидоров        +-----+



В принципе, в табличке первого письма я и старался изобразить нечто подобное.
...
Рейтинг: 0 / 0
Просьба помочь с пересечением времен
    #39980666
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with t as
(
 select
  a.SessionID, a.UserName, a.StartSession, c.EndSession,
  row_number() over (partition by a.SessionID, a.UserName, a.StartSession order by c.EndSession) as rn
 from
  @tb a left join
  @tb b on b.UserName = a.UserName and b.StartSession > a.StartSession and b.StartSession <= a.EndSession and b.EndSession >= a.StartSession cross apply
  (select isnull(b.StartSession, a.EndSession)) c(EndSession)
)
select
 SessionID, UserName, StartSession, EndSession
from
 t
where
 rn = 1;
...
Рейтинг: 0 / 0
Просьба помочь с пересечением времен
    #39980690
An111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm, Спасибо! Ошибки найти не смог!
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Просьба помочь с пересечением времен
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]