Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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 ) Необходимо получить выбору:
|
29 янв 13, 23:25 [13847855] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Новейшие исследования Британских Ученых установили select 2 более кошерно. |
||
30 янв 13, 10:45 [13849116] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |