Помогите с запросот

Greenhorn
Дата: 29.01.2013 23:25:03
Добрый вечер
Есть SQL2k8
Дано:
declare @t table( id int identity, PhA sysname, PhB sysname, DTS datetime, dur int )
insert into @t(PhA, PhB, DTS, dur) values
 ('123','456', '20130101 10:00:10', 40 )
,('123','456', '20130101 10:00:00', 50 )
,('123','456', '20130101 10:00:20', 30 )

,('123','456', '20130102 10:00:10', 40 )
,('123','456', '20130102 10:00:00', 50 )
,('123','456', '20130102 10:00:20', 30 )

,('123','456', '20130101 11:00:00', 20 )
,('123','456', '20130101 12:00:00', 30 )

Необходимо получить выбору:

PhA, PhB, DTS, dur
'123','456', '20130101 10:00:00', 50
'123','456', '20130102 10:00:00', 50
'123','456', '20130101 11:00:00', 20
'123','456', '20130101 12:00:00', 30

Т.е. если есть пересечение по времени (DTS,dateadd(s,dur,DST)), то вывести только первую (DTS ASC) запись.
Как одним запросом добиться желаемого ?
aleks2
Дата: 30.01.2013 06:30:25
declare @t table( id int identity, PhA sysname, PhB sysname, DTS datetime, dur int )
insert into @t(PhA, PhB, DTS, dur) values
 ('123','456', '20130101 10:00:10', 40 )
,('123','456', '20130101 10:00:00', 50 )
,('123','456', '20130101 10:00:20', 30 )

,('123','456', '20130102 10:00:10', 40 )
,('123','456', '20130102 10:00:00', 50 )
,('123','456', '20130102 10:00:20', 30 )

,('123','456', '20130101 11:00:00', 20 )
,('123','456', '20130101 12:00:00', 30 )

select * 
   from @t T 
   where not exists(select * from @t TT where T.id<>TT.id and T.DTS<TT.DTS and T.DTS<= dateadd(s, TT.dur, TT.DTS) and TT.DTS<= dateadd(s, T.dur, T.DTS)  )
   order by T.DTS
Greenhorn
Дата: 30.01.2013 10:05:28
aleks2,

Спасибо за намек. Зациклился на "пересечение по времени".
В реальной таблице довольно часто поле DTS у нескольких записей одинаково.
Вот правильный запрос по мотивам Вашего.
;with t as (
  SELECT top 1 with ties *
  FROM @t
  ORDER BY ROW_NUMBER() OVER(PARTITION BY PhA, PhB, DTS ORDER BY DTS)
)
select * 
from t 
where not exists(
  select 1
  from @t TT 
  where T.id <> TT.id 
    and T.DTS > TT.DTS                      -- по условию нужно DTS ASC 
    and T.PhA = TT.PhA and T.PhB = TT.PhB   -- забыл упомянуть про это условие
    and T.DTS <= dateadd(s, TT.dur, TT.DTS) 
    and TT.DTS <= dateadd(s, T.dur, T.DTS)  
)
order by T.DTS
Еще раз спасибо.
aleks2
Дата: 30.01.2013 10:45:14
Greenhorn
[/src]where not exists(
select 1
)

[/src]

Новейшие исследования Британских Ученых установили
select 2
более кошерно.