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

Откуда:
Сообщений: 17
Есть таблица, в которую логируются результаты опроса датчика. В случае если датчик был недоступен, в столбец статуса пишется 0, если доступен, 1,2,3 в зависимости от состояния датчика.
Беда в том, что периодически датчик недоступен.
Если он недоступен 5-10 опросов, то ничего страшного.
Если больше то нужно поднимать аларм...


В общем помогите пожалуйста, как посчитать кол-во 0 от конца таблицы, до первого не нулевого значения?


ну и попутно, а почему не работает вот так:

SELECT COUNT(*) (
SELECT TOP 1000 Status FROM Statuses ORDER BY TimeStamp desc
) AS Status
WHERE Status = 0
19 мар 12, 09:28    [12271485]     Ответить | Цитировать Сообщить модератору
 Re: Длина очереди  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Заведите себе служебную таблицу со счетчиком нулевых статусов, поддерживаемую триггером на основной таблице.
19 мар 12, 09:44    [12271533]     Ответить | Цитировать Сообщить модератору
 Re: Длина очереди  [new]
qwertun
Member

Откуда:
Сообщений: 17
invm,

неужто нельзя никак? таблицы служебные все это понятно, но имхо, некрасиво (
19 мар 12, 10:33    [12271831]     Ответить | Цитировать Сообщить модератору
 Re: Длина очереди  [new]
lapposv
Member

Откуда: Санкт-Петербург
Сообщений: 27
qwertun
ну и попутно, а почему не работает вот так:

SELECT COUNT(*) (
SELECT TOP 1000 Status FROM Statuses ORDER BY TimeStamp desc
) AS Status
WHERE Status = 0

Данный запрос вернёт только записи со статусом 0. По нему не понятно как разобраться что этот статус повторился 5-ть раз подряд. Если есть 1000 записей с таким статусом или больше, он вернёт 1000.
19 мар 12, 10:42    [12271887]     Ответить | Цитировать Сообщить модератору
 Re: Длина очереди  [new]
qwertun
Member

Откуда:
Сообщений: 17
lapposv,

Ну 1000 можно сменить на 10 и то что надо, если 10 из 10 то бьем тревогу
Но вот беда с desc не работает (
19 мар 12, 11:00    [12272017]     Ответить | Цитировать Сообщить модератору
 Re: Длина очереди  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
если табличка не очень жирная и есть соотв. индексы,то можно получать разницу как-то так
declare @t table(id int,status int,TimeStamp timestamp )
insert into @t
        ( id
        , status
        )
values  ( 1,1)
        ,( 2,0)
        ,( 3,0)
        ,( 4,0)
        ,( 5,0)
        ,( 6,1)
        ,( 7,0)
        


;with zz(id_max_0,id_max_1)
as
( select 
(select top (1) id
from @t
where [@t].status = 0
order by TimeStamp  desc) 
,(select top (1) id
from @t
where [@t].status = 1
order by TimeStamp  desc) 
)
select * 
,id_max_0 - id_max_1 as between0_1
from zz
19 мар 12, 11:01    [12272025]     Ответить | Цитировать Сообщить модератору
 Re: Длина очереди  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
qwertun,
Почему никак? Вот примерно так:
select
 count(*)
from
 Statuses t
where
 [timestamp] > (select top (1) [timestamp] from Statuses where status > 0 order by [timestamp] desc);
19 мар 12, 11:04    [12272046]     Ответить | Цитировать Сообщить модератору
 Re: Длина очереди  [new]
lapposv
Member

Откуда: Санкт-Петербург
Сообщений: 27
А вот если
SELECT COUNT(1) from (
SELECT TOP 10 Status FROM Statuses ORDER BY TimeStamp desc
) AS Status
where Status=0

Если запрос вернёт 10 - значит было 10-ть срабатываний подряд.
19 мар 12, 11:08    [12272069]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить