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

Откуда:
Сообщений: 311
Добрый вечер
Есть 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) запись.
Как одним запросом добиться желаемого ?
29 янв 13, 23:25    [13847855]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросот  [new]
aleks2
Guest
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
30 янв 13, 06:30    [13848364]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросот  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
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
Еще раз спасибо.
30 янв 13, 10:05    [13848866]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросот  [new]
aleks2
Guest
Greenhorn
[/src]where not exists(
select 1
)

[/src]

Новейшие исследования Британских Ученых установили
select 2
более кошерно.
30 янв 13, 10:45    [13849116]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить