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

Откуда:
Сообщений: 17
Здравствуйте, форумчане!
Помогите, пожалуйста, с запросом.
Имеется таблица, в ней есть столбцы FIO, Date_from, Date_To. Возможно ли составить запрос, выводящий строки с одинаковыми ФИО и пересекающимися периодами?
Например, таблица:
Иванов | 01.01.2012 | 05.01.2012
Петров | 01.01.2012 | 05.01.2012
Иванов | 04.01.2012 | 09.01.2012
Петров | 06.01.2012 | 09.01.2012

В данном случае, строки "Иванов" пересекаются по датам. Запрос должен вывести либо обе этих строки, либо просто поле ФИО, а дальше я сам найду.
10 сен 12, 17:26    [13141790]     Ответить | Цитировать Сообщить модератору
 Re: Поиск строк с пересекающимися периодами  [new]
SAURONoff
Member

Откуда:
Сообщений: 17
Поиск повторяющихся фамилий уже сделал, вот так:

use base
select putevki.FIO, spr_smena.start_date, spr_smena.end_date from PUTEVKI inner join spr_smena on spr_smena.smena_id=putevki.smena_smena_id
where (putevki.FIO) in (
select putevki.FIO
from PUTEVKI
group by putevki.FIO having count(*)>1
)
order by putevki.FIO

Как бы сюда сравнение дат прилепить?
10 сен 12, 17:51    [13141949]     Ответить | Цитировать Сообщить модератору
 Re: Поиск строк с пересекающимися периодами  [new]
fio=fio
Guest
SAURONoff,

where exists (... where fio=fio and (datebegin <= dateend or dateend >= datebegin)))
10 сен 12, 17:58    [13141979]     Ответить | Цитировать Сообщить модератору
 Re: Поиск строк с пересекающимися периодами  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
SAURONoff
Поиск повторяющихся фамилий уже сделал, вот так:

SELECT	 P.FIO
	,S.start_date
	,S.end_date
FROM	     dbo.PUTEVKI	P
	JOIN dbo.spr_smena	S on S.smena_id = P.smena_smena_id
	JOIN(	SELECT	FIO
		FROM	dbo.PUTEVKI
		GROUP BY FIO
		HAVING	Count(*) > 1
			)	G ON G.FIO = P.FIO
ORDER BY P.FIO


Как бы сюда сравнение дат прилепить?
Use тег SRC, форматируйте запрос.
У нас глаза болят.
Всегда пишите схему (dbo.)
Всегда пишите алиасы таблиц в запросах
Не используйте IN (для этого есть Exists или делать JOIN)

Можно поставить триггер на талбицу dbo.spr_smena где проверять Inserted на пересечение
IF Exists(
	SELECT	 *
	FROM	     Inserted		I
		JOIN dbo.spr_smena	T ON T.smena_id != I.smena_id
	WHERE	    T.start_date < I.end_date
		AND I.start_date < T.end_date
) BEGIN
	ROLLBACK
	RAISERROR('Найдены пересечения',18,1)
	RETURN
END
А для контроля FIO просто повесить UNIQUE ограничение на таблицу dbo.PUTEVKI.
10 сен 12, 18:14    [13142061]     Ответить | Цитировать Сообщить модератору
 Re: Поиск строк с пересекающимися периодами  [new]
SAURONoff
Member

Откуда:
Сообщений: 17
Большое спасибо, разобрался, все советы пригодились, пожелания учту! =)

Вот, что вышло в итоге:
SELECT	DISTINCT P.FIO
	,S.start_date
	,S.end_date
FROM	     dbo.PUTEVKI	P
	JOIN dbo.spr_smena	S on S.smena_id = P.smena_smena_id
where exists (
SELECT * 
   FROM dbo.PUTEVKI P1 JOIN dbo.spr_smena	S1 on S1.smena_id = P1.smena_smena_id
where P.FIO=P1.FIO and P.put_id <> P1.put_id 
and S.start_date < S1.end_date and S.start_date >= S1.start_date
)
ORDER BY P.FIO
12 сен 12, 17:50    [13153574]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить