Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Найти перекрытия в таблице периодов / 10 сообщений из 10, страница 1 из 1
03.10.2014, 12:15
    #38765883
Cheerful Calf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти перекрытия в таблице периодов
Есть таблица в которой хранятся: сотрудник, должность, начало, конец. Надо выбрать по сотрудникам всех кто работает в более чем одной должности и по позициям все на которые назначены более одного работника (в любой из месяцов).
Надо чтобы ДО инсерта или апдейта проверить и предотварить создание "оверлапов".
Как это сделать?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
DECLARE @AssigmentsTable TABLE (
	Id int NOT NULL PRIMARY KEY CLUSTERED (Id ASC),
	Employee nvarchar(32) NULL,
	Job nvarchar(32) NULL,
	StartDate date NULL,
	EndDate date NULL)

INSERT INTO @AssigmentsTable (Id, Employee, JOB, StartDate, EndDate) VALUES (1, 'John', 'Junior Cleaner', '2015.01.01', '2015.02.01')
INSERT INTO @AssigmentsTable (Id, Employee, JOB, StartDate, EndDate) VALUES (2, 'John', 'Cleaner', '2015.04.01', '2015.07.01')
INSERT INTO @AssigmentsTable (Id, Employee, JOB, StartDate, EndDate) VALUES (3, 'John', 'Seniour Cleaner', '2015.08.01', '2015.12.01')
INSERT INTO @AssigmentsTable (Id, Employee, JOB, StartDate, EndDate) VALUES (4, 'Mark', 'Boss', '2015.01.01', '2015.12.01')
INSERT INTO @AssigmentsTable (Id, Employee, JOB, StartDate, EndDate) VALUES (5, 'Phill', 'Helper', '2015.05.01', '2015.06.01')

SELECT * FROM @AssigmentsTable

UPDATE @AssigmentsTable SET Employee = 'Mark', StartDate = '2015.05.01', EndDate = '2015.06.01' WHERE Id = 5
SELECT 0, 'Should not be possible - would be an overlap between 4 and 5 (one employee in several positions)', NULL, NULL, NULL UNION ALL SELECT * FROM @AssigmentsTable
UPDATE @AssigmentsTable SET Employee = 'Phill', StartDate = '2015.05.01', EndDate = '2015.06.01' WHERE Id = 5--undo

UPDATE @AssigmentsTable SET Job = 'Cleaner', StartDate = '2015.05.01', EndDate = '2015.06.01' WHERE Id = 5
SELECT 0, 'Should not be possible - would be an overlap between 3 and 5 (two employees in same position)', NULL, NULL, NULL UNION ALL SELECT * FROM @AssigmentsTable
UPDATE @AssigmentsTable SET Job = 'Helper', StartDate = '2015.05.01', EndDate = '2015.06.01' WHERE Id = 5 --undo

UPDATE @AssigmentsTable SET Job = 'Cleaner', StartDate = '2015.08.01', EndDate = '2015.12.01' WHERE Id = 5
SELECT 0, 'Such udate is possible - we changed job without creating overlaps', NULL, NULL, NULL UNION ALL SELECT * FROM @AssigmentsTable
...
Рейтинг: 0 / 0
03.10.2014, 12:22
    #38765908
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти перекрытия в таблице периодов
Вы уже не можете написать простой запрос на поиск пересекающихся периодов ?
...
Рейтинг: 0 / 0
03.10.2014, 12:27
    #38765926
Cheerful Calf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти перекрытия в таблице периодов
PS: Glory, здравствуйте.
хотел в первом посте поприветствовать, но подумал - а вдруг пронесет..
...
Рейтинг: 0 / 0
03.10.2014, 12:28
    #38765930
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти перекрытия в таблице периодов
- Доброго здоровья !
- Не дождетесь.
...
Рейтинг: 0 / 0
03.10.2014, 13:56
    #38766088
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти перекрытия в таблице периодов
Запомните простое правило - интервалы перекрываются, если начало первого меньше или равно концу второго вместе с тем, что начало второго меньше или равно концу первого.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
16.11.2020, 13:26
    #40018804
dab2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти перекрытия в таблице периодов
Владислав Колосов,

можно лаконичный пример на поиск итоговых начала и конца пересекающихся интервалов?

Задача подвернулась:

Дана таблица с двумя полями. Первое поле - дата начала события, второе - окончания. События расположены в произвольном порядке, могут пересекаться, одно событие может включать в себя другое и т.д. Необходимо вывести набор дат начала и окончания итогового, объединенного события.

Например, если входные данные

01.09.2017 10.12.2020
03.08.2017 09.01.2019
12.12.2022 10.05.2023
04.01.2000 05.07.2001
01.06.2001 05.08.2001

Результат должен быть

04.01.2000 05.08.2001
03.08.2017 10.12.2020
12.12.2022 10.05.2023

Желательно не использовать в решении циклы и курсоры.
...
Рейтинг: 0 / 0
16.11.2020, 13:51
    #40018825
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти перекрытия в таблице периодов
dab2,

тут - Запрос на укрупнение периодов с полдюжины вариантов
Выбирай
...
Рейтинг: 0 / 0
16.11.2020, 13:58
    #40018830
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти перекрытия в таблице периодов
dab2
Желательно не использовать в решении циклы и курсоры.

Ну так self join с условием, которое Владислав упоминал и выборка минимального начала и максимального конца.
...
Рейтинг: 0 / 0
16.11.2020, 21:15
    #40019136
dab2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти перекрытия в таблице периодов
fkthat,
Код: sql
1.
2.
3.
SELECT Даты.дата1, Даты.дата2, Даты_1.дата1, Даты_1.дата2
FROM Даты, Даты AS Даты_1
WHERE (((Даты.дата1)<=[даты_1].[дата2]) AND ((Даты_1.дата1)<=[даты].[дата2]));



Даты.дата1 Даты.дата2 Даты_1.дата1 Даты_1.дата204.01.2000 05.07.2001 01.06.2001 05.08.200104.01.2000 05.07.2001 04.01.2000 05.07.200101.06.2001 05.08.2001 01.06.2001 05.08.200101.06.2001 05.08.2001 04.01.2000 05.07.200103.08.2017 09.01.2019 03.08.2017 09.01.201903.08.2017 09.01.2019 01.09.2017 10.12.202001.09.2017 10.12.2020 03.08.2017 09.01.201901.09.2017 10.12.2020 01.09.2017 10.12.202012.12.2022 10.05.2023 12.12.2022 10.05.2023

Такой результат получается следуя этому совету.
...
Рейтинг: 0 / 0
29.11.2020, 22:45
    #40023214
dab2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти перекрытия в таблице периодов
Код: sql
1.
2.
3.
4.
SELECT  Даты.дата1, Даты.дата2
FROM            Даты CROSS JOIN
                         Даты AS Даты_1
WHERE        (Даты.дата1 <= Даты_1.Дата1) AND (Даты_1.дата2 <> Даты.Дата2) AND (Даты.дата2 >= Даты_1.Дата1) AND (Даты_1.дата1 <> Даты.Дата1);


Как такой вариант?

Результат:
дата1 дата22017-08-03 2019-01-09 2000-01-04 2001-07-05
Но есть одно НО - интервал без перекрытий не отображается:
12.12.2022 10.05.2023

Эффективность на больших данных не тестировал.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Найти перекрытия в таблице периодов / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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