Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Про пересекающиеся периоды / 10 сообщений из 10, страница 1 из 1
13.03.2018, 11:19
    #39613998
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про пересекающиеся периоды
Здравствуйте!

Есть такая задачка. Есть таблица, где по каждому юр лицу перечисляются список мероприятий, с указанными периодами. Если по какому ту юр лицу присутствуют мероприятие с пересекающими периодами, то выбирается последнее мероприятие. То есть отбрасываем зачеркнутые строки.

Номер мероприятия Код юр лица Дата начала Дата окончанияНомер мероприятия1 00001 01.02.2018 01.02.2018Номер мероприятия2 00001 03.02.2018 03.02.2018Номер мероприятия3 00001 03.02.2018 03.02.2018Номер мероприятия4 00001 06.02.2018 08.02.2018Номер мероприятия5 00001 08.02.2018 08.02.2018Номер мероприятия6 00002 01.02.2018 01.02.2018Номер мероприятия7 00002 08.02.2018 08.02.2018Номер мероприятия8 00002 06.02.2018 08.02.2018
SQL-запрос с исходными данными
Код: 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.
DECLARE @Таблица table(
	[Номер мероприятия] varchar(20),
	[Код юр лица] varchar(8),	
	[Дата начала] date,
	[Дата окончания] date)
;

INSERT INTO
  @Таблица
VALUES 
('Номер мероприятия1','00001','01.02.2018','01.02.2018'),
('Номер мероприятия2','00001','03.02.2018','03.02.2018'),
('Номер мероприятия3','00001','03.02.2018','03.02.2018'),
('Номер мероприятия4','00001','06.02.2018','08.02.2018'),
('Номер мероприятия5','00001','08.02.2018','08.02.2018'),
('Номер мероприятия6','00002','01.02.2018','01.02.2018'),
('Номер мероприятия7','00002','08.02.2018','08.02.2018'),
('Номер мероприятия8','00002','06.02.2018','08.02.2018')
;

SELECT DISTINCT
	[Код юр лица]
FROM
	@Таблица 


Скажите, каким образом надо решать такую задачу?
...
Рейтинг: 0 / 0
13.03.2018, 11:33
    #39614010
Про пересекающиеся периоды
Код: sql
1.
2.
3.
4.
5.
6.
7.
select * from @Таблица t1
where not exists(
		select 1 from @Таблица t2 
		where	t1.[Код юр лица]=t2.[Код юр лица] 
			and	(t1.[Дата начала] between t2.[Дата начала] and t2.[Дата окончания] or t1.[Дата окончания] between t2.[Дата начала] and t2.[Дата окончания]) 
			and t1.[Номер мероприятия]<t2.[Номер мероприятия] 
		)



Номер мероприятияКод юр лицаДата началаДата окончанияНомер мероприятия1000012018-01-022018-01-02Номер мероприятия3000012018-03-022018-03-02Номер мероприятия5000012018-08-022018-08-02Номер мероприятия6000022018-01-022018-01-02Номер мероприятия8000022018-06-022018-08-02
...
Рейтинг: 0 / 0
13.03.2018, 11:34
    #39614011
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про пересекающиеся периоды
ferzmikk,

Код: sql
1.
2.
3.
4.
5.
6.
7.
With with_number as 
(Select *, row_number() over(
Order by (Select 1) --Критерий по которому определяется последний
) as rn from @Таблица)

Select * From with_number a 
Where not exists (Select 1 From with_number b Where a.[Код юр лица] = b.[Код юр лица] and a.rn<b.rn and a.[Дата начала]<=b.[Дата окончания] and a.[Дата окончания]>=b.[Дата окончания])
...
Рейтинг: 0 / 0
13.03.2018, 11:35
    #39614012
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про пересекающиеся периоды
ferzmikk,

если классически - находите ключи с максимальным значением из списка пересечения по самообъединению, добавляете сроки, которые не пересекаются. Можно, например, объединение слева использовать.
...
Рейтинг: 0 / 0
13.03.2018, 14:44
    #39614149
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про пересекающиеся периоды
Возможно ли добавить поле, который информирует, что по этому мероприятию было удалено другого мероприятие, которое пересекалось периодом?
...
Рейтинг: 0 / 0
13.03.2018, 15:02
    #39614161
так,
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про пересекающиеся периоды
авторВозможно ли добавить поле, который информирует, что по этому мероприятию было удалено другого мероприятие, которое пересекалось периодом?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
select 
	t1.* 
	
	,case when exists(
					select 1 from @Таблица t2 
					where	t1.[Код юр лица]=t2.[Код юр лица] 
						and	(t1.[Дата начала] between t2.[Дата начала] and t2.[Дата окончания] or t1.[Дата окончания] between t2.[Дата начала] and t2.[Дата окончания]) 
						and t1.[Номер мероприятия]>t2.[Номер мероприятия] 
					)
		then 1
		else 0
	end as flag

from @Таблица t1

where not exists(
		select 1 from @Таблица t2 
		where	t1.[Код юр лица]=t2.[Код юр лица] 
			and	(t1.[Дата начала] between t2.[Дата начала] and t2.[Дата окончания] or t1.[Дата окончания] between t2.[Дата начала] and t2.[Дата окончания]) 
			and t1.[Номер мероприятия]<t2.[Номер мероприятия] 
		)



Номер мероприятияКод юр лицаДата началаДата окончанияflagНомер мероприятия1000012018-01-022018-01-020Номер мероприятия3000012018-03-022018-03-021Номер мероприятия5000012018-08-022018-08-021Номер мероприятия6000022018-01-022018-01-020Номер мероприятия8000022018-06-022018-08-021
...
Рейтинг: 0 / 0
13.03.2018, 15:07
    #39614162
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про пересекающиеся периоды
так,,

скупой платит дважды?
...
Рейтинг: 0 / 0
13.03.2018, 15:18
    #39614166
так,
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про пересекающиеся периоды
TaPaKтак,,

скупой платит дважды? :)

нуу, как-то такое выглядит "сильно пугающе" чем 2-а простых экзиста ...

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select 
	t1.* 
	,haba.flag2
from @Таблица t1

outer apply(
		select 
				flag1	=max(case when t3.[Номер мероприятия]<t2.[Номер мероприятия] then 1 else 0 end)
				,flag2	=max(case when t3.[Номер мероприятия]>t2.[Номер мероприятия] then 1 else 0 end)  
		from @Таблица t2 cross join (select t1.[Номер мероприятия] as [Номер мероприятия]) t3
		where	t1.[Код юр лица]=t2.[Код юр лица] 
			and	(t1.[Дата начала] between t2.[Дата начала] and t2.[Дата окончания] or t1.[Дата окончания] between t2.[Дата начала] and t2.[Дата окончания]) 
		) haba

where haba.flag1=0
...
Рейтинг: 0 / 0
14.03.2018, 17:12
    #39614894
Pochemoochka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про пересекающиеся периоды
и так! :)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Declare @T Table (Title varchar(50), Code varchar(5), DateFrom date, DateTo date)

Insert @T
    Values 
        ('Номер мероприятия1', '00001', '01.02.2018',	'01.02.2018'),
        ('Номер мероприятия2', '00001', '03.02.2018',	'03.02.2018'),
        ('Номер мероприятия3', '00001', '03.02.2018',	'03.02.2018'),
        ('Номер мероприятия4', '00001', '06.02.2018',	'08.02.2018'),
        ('Номер мероприятия5', '00001', '08.02.2018',	'08.02.2018'),
        ('Номер мероприятия6', '00002',	'01.02.2018',	'01.02.2018'),
        ('Номер мероприятия7', '00002',	'08.02.2018',	'08.02.2018'),
        ('Номер мероприятия8', '00002',	'06.02.2018',	'08.02.2018')


    ; with T as
        ( Select *, row_number() Over (Order by Code, DateFrom, DateTo, Title) N 
          From @T
        )
        Select Source.* 
          From T as Source
               Left Join T as Dist
               On Source.DateFrom <= Dist.DateTo and Source.DateTo >= Dist.DateFrom and Source.Code = Dist.Code and Dist.N <> Source.N
         Where Source.N > Dist.N or Dist.N IS NULL
...
Рейтинг: 0 / 0
15.03.2018, 07:26
    #39615157
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про пересекающиеся периоды
Спасибо!
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Про пересекающиеся периоды / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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