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

Откуда: Запорожье
Сообщений: 855
Добрый день, уважаемые форумчане.

MSSQL-2005.

Есть таблица tbParams, которая хранит огромное количество записей следующего вида:
DTValue (datetime) – время выраженное в секундах;
ValueX (real) – значение в диапазоне от 10 до 20.

Теперь вопрос.
Как должен выглядеть запрос, или каскад запросов, чтобы извлечь из таблицы данные, удовлетворяющие следующим условиям:
Если ValueX >= 15 и это первое найденное значение, то такая запись попадает в результат. Считаем такую запись предыдущей записью.
Следующая запись попадет в результат, только если ValueX уменьшается ниже 15 и если DTValue, время между предыдущей записью и новой записью превысило 10 секунд.

Заранее благодарен.
30 апр 13, 14:49    [14249659]     Ответить | Цитировать Сообщить модератору
 Re: Детектор превышения порогового значения  [new]
aleks2
Guest
declare @t table(DTValue datetime primary key clustered, ValueX real);

insert @t
select '20130430 00:00:00', 10
union all
select '20130430 00:00:01', 10
union all
select '20130430 00:00:02', 15
union all
select '20130430 00:00:03', 10
union all
select '20130430 00:00:04', 10
union all
select '20130430 00:00:05', 10
union all
select '20130430 00:00:06', 10
union all
select '20130430 00:00:07', 15
union all
select '20130430 00:00:08', 10
union all
select '20130430 00:00:09', 10
union all
select '20130430 00:00:10', 10
union all
select '20130430 00:00:11', 10
union all
select '20130430 00:00:12', 10
union all
select '20130430 00:00:13', 10
union all
select '20130430 00:00:14', 10
union all
select '20130430 00:00:15', 10
union all
select '20130430 00:00:16', 10
union all
select '20130430 00:00:17', 10
union all
select '20130430 00:00:18', 15

select * 
from @t t where t.ValueX >= 15 
  and  not exists(select * 
                    from @t tt 
                    where tt.ValueX >= 15 
                    and tt.DTValue>=dateadd(second, -10, t.DTValue) and tt.DTValue<t.DTValue)
union all
select *
from @t t where t.ValueX < 15 
  and  exists(select * 
                    from @t tt 
                    where tt.ValueX >= 15 
                    and tt.DTValue>=dateadd(second, -10, t.DTValue) and tt.DTValue<t.DTValue)
  and  not exists(select * 
                    from @t tt 
                    where tt.ValueX < 15 
                    and tt.DTValue>t.DTValue
                    and tt.DTValue< dateadd(second, 10, (select max(tt.DTValue) from @t tt where tt.ValueX >= 15 and tt.DTValue>=dateadd(second, -10, t.DTValue) and tt.DTValue<t.DTValue))
                 )
order by DTValue
30 апр 13, 16:48    [14250401]     Ответить | Цитировать Сообщить модератору
 Re: Детектор превышения порогового значения  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
declare @t table (DTValue datetime,ValueX int)

insert into @t(DTValue,ValueX)
values(cast(1.0/(24*60*60)+0.00001 as datetime) ,10)
,(cast(5.0/(24*60*60)+0.00001 as datetime) ,11)
,(cast(10.0/(24*60*60)+0.00001 as datetime) ,16)
,(cast(15.0/(24*60*60)+0.00001 as datetime) ,17)
,(cast(16.0/(24*60*60)+0.00001 as datetime) ,10)
,(cast(18.0/(24*60*60)+0.00001 as datetime) ,15)
,(cast(21.0/(24*60*60)+0.00001 as datetime) ,11)
,(cast(32.0/(24*60*60)+0.00001 as datetime) ,16)
,(cast(42.0/(24*60*60)+0.00001 as datetime) ,11)

declare @sd datetime
select
@sd = MIN(DTValue)
from @t where ValueX>=15

;with preSel1 as( 
select 

rn=ROW_NUMBER() over (order by DTValue)   
,DTValue
,ValueX
,os=case when ValueX>=15 then 1 else 0 end
from @t t
where DTValue>=@sd
)
,preSel2 as(
select
s1.*
,s2.rn rn2
,s2.DTValue DTVAlue2

from	preSel1 s1
		inner join 		preSel1 s2
		on s2.rn>s1.rn and s2.os<>s1.os and DATEDIFF(SECOND,s1.DTValue,s2.DTValue) >=10

)
,preSel3 as(
select 
	rn2
	,MAX(DTVAlue2) DTValue
from preSel2
group by rn2
union all 
select
rn,
DTValue
from preSel1
where rn=1)
select
	t.*
from	@t t
		inner join preSel3 s
		on 	s.DTValue = t.DTValue
order by t.DTValue		
30 апр 13, 16:51    [14250422]     Ответить | Цитировать Сообщить модератору
 Re: Детектор превышения порогового значения  [new]
AlexKB
Member

Откуда: Запорожье
Сообщений: 855
Большое спасибо ответившим!
Теперь поковыряюсь, а то не знал в какую сторону и посмотреть.
30 апр 13, 16:55    [14250450]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить