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

Откуда: Приморье
Сообщений: 535
Всем привет.
Смотрите есть 2 таблицы, связанных ключом.
T1
=================
id Pole1 Pole2
=================
1 sdsd svvv
2 ewe bgbg
3 ....... .......
4 ....... .......
......

T2
====================
id Value Dt idT1
====================
1 0 3232323 2
2 34 34353434 1
3 0 3232333 2
4 0 3232343 2
......
Dt- кол-во секунд от 01-01-1970 до текущей даты с шагом в 10 секунд ,т.е. каждые 10 сек. в нее пишутся определенные данные.

Как можно отобрать все записи из T1, где для T2 сумма значений поля Value = 0 для последних по времени Dt 5-ти записей????
Одним запросом.
Натолкните на мысль, плз.....
27 май 15, 17:07    [17697253]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в построении запроса  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8826
select ... from ... where exists ()
27 май 15, 17:26    [17697377]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в построении запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
RAMZEZ II,

PRINT @@VERSION что показывает?
27 май 15, 17:27    [17697386]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в построении запроса  [new]
o-o
Guest
Value бывают и отрицательные тоже?
т.е. вы ищите 5 нулей подряд в смысле времени,
или именно сумма должна равняться нулю, типа (-1, -2, -3, -4, 10) пойдет?
27 май 15, 17:34    [17697429]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в построении запроса  [new]
RAMZEZ II
Member

Откуда: Приморье
Сообщений: 535
o-o
Value бывают и отрицательные тоже?
т.е. вы ищите 5 нулей подряд в смысле времени,
или именно сумма должна равняться нулю, типа (-1, -2, -3, -4, 10) пойдет?


Нет, Value может быть или 0 или другое положительное число
Мне нужно получить данные из T1, для которых за последних 50 секунд (5строк*10 сек. каждая грубо говоря) сумма значений в поле Value = 0
27 май 15, 17:52    [17697523]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в построении запроса  [new]
RAMZEZ II
Member

Откуда: Приморье
Сообщений: 535
iap
RAMZEZ II,

PRINT @@VERSION что показывает?

У меня sql2008r2
27 май 15, 17:53    [17697528]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в построении запроса  [new]
o-o
Guest
ну так сумма неотрицательных чисел будет нулем,
только если каждое из слагаемых ноль.
короче, все нули подряд.

версию сервера еще огласите
27 май 15, 17:55    [17697538]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в построении запроса  [new]
RAMZEZ II
Member

Откуда: Приморье
Сообщений: 535
RAMZEZ II
o-o
Value бывают и отрицательные тоже?
т.е. вы ищите 5 нулей подряд в смысле времени,
или именно сумма должна равняться нулю, типа (-1, -2, -3, -4, 10) пойдет?


Нет, Value может быть или 0 или другое положительное число
Мне нужно получить данные из T1, для которых за последних 50 секунд (5строк*10 сек. каждая грубо говоря) сумма значений в поле Value = 0


т.е. из моих примерных таблиц это строка id=2 из T1
27 май 15, 17:55    [17697541]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в построении запроса  [new]
RAMZEZ II
Member

Откуда: Приморье
Сообщений: 535
o-o
ну так сумма неотрицательных чисел будет нулем,
только если каждое из слагаемых ноль.
короче, все нули подряд.

версию сервера еще огласите


да именно так!
sql2008r2
27 май 15, 17:56    [17697547]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в построении запроса  [new]
Добрый Э - Эх
Guest
RAMZEZ II,

типовая задача на START_OF_GROUP. С версии 2012 решается на lead/lag + sum() over(... order by)
на 2008-й версии - через [cross | outer] apply с top n подзапросом
27 май 15, 18:32    [17697706]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в построении запроса  [new]
Добрый Э - Эх
Guest
RAMZEZ II,

ну, и вариант с разностью двух разнооконных row_number-ов никто не отменял... ;)
27 май 15, 18:38    [17697734]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в построении запроса  [new]
Добрый Э - Эх
Guest
Добрый Э - Эх
RAMZEZ II,

ну, и вариант с разностью двух разнооконных row_number-ов никто не отменял... ;)
одного row_number-а хватит. да и тот за уши будет притянут...
27 май 15, 18:50    [17697792]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в построении запроса  [new]
Добрый Э - Эх
Guest
RAMZEZ II,

+ <== "лобовой" вариант, без изысков...
--
-- Тестовые наборы данных
with
--
-- Таблица T1:
    t1 (id, pole1, pole2) as
    (
      select *
        from (
               values
                 (1,'fhwfh', 3847)
                ,(2,'hffsw', 5031)
             ) v(id, pole1, pole2)
    )
--
-- Таблица T2:
  , t2 (id, val, id_t1) as 
    (
      select *
        from (values
                (1,1,1),(2,3,1),(3,0,1),(4,0,1),(5,0,1),(6,0,1),(7,0,1),(8,1,1),(9,0,1),(10,0,1)
               ,(1,1,2),(2,3,2),(3,0,2),(4,0,2),(5,0,2),(6,0,2),(7,0,2)
             )v(id,val,id_t1)
    )
--
-- Основной запрос:
select t1.*
-- Выбрали из T1 нужные записи:
  from t1
  join (
         select id_t1 
           from (-- отобрали из T2 последние 5 записей по каждому ID_T1:
                  select top 1 with ties t.*
                    from t2 t
                   order by row_number() over(partition by id_t1 order by id desc)/6 -- обещанный row_number :)
                ) v
          group by id_t1
         -- из последних пяти записей по каждому id_t1 взяли лишь те, 
         -- для которых все 5 записей имеют Val = 0 :
         having count(1) = 5
            and sum(val) = 0
       ) v
    on t1.id = v.id_t1
on-line проверка на sqlfiddle.com
27 май 15, 19:09    [17697857]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в построении запроса  [new]
RAMZEZ II
Member

Откуда: Приморье
Сообщений: 535
Добрый Э - Эх
RAMZEZ II,

+ <== "лобовой" вариант, без изысков...
--
-- Тестовые наборы данных
with
--
-- Таблица T1:
    t1 (id, pole1, pole2) as
    (
      select *
        from (
               values
                 (1,'fhwfh', 3847)
                ,(2,'hffsw', 5031)
             ) v(id, pole1, pole2)
    )
--
-- Таблица T2:
  , t2 (id, val, id_t1) as 





    (
      select *
        from (values
                (1,1,1),(2,3,1),(3,0,1),(4,0,1),(5,0,1),(6,0,1),(7,0,1),(8,1,1),(9,0,1),(10,0,1)
               ,(1,1,2),(2,3,2),(3,0,2),(4,0,2),(5,0,2),(6,0,2),(7,0,2)
             )v(id,val,id_t1)
    )
--
-- Основной запрос:
select t1.*
-- Выбрали из T1 нужные записи:
  from t1
  join (
         select id_t1 
           from (-- отобрали из T2 последние 5 записей по каждому ID_T1:
                  select top 1 with ties t.*
                    from t2 t
                   order by row_number() over(partition by id_t1 order by id desc)/6 -- обещанный row_number :)
                ) v
          group by id_t1
         -- из последних пяти записей по каждому id_t1 взяли лишь те, 
         -- для которых все 5 записей имеют Val = 0 :
         having count(1) = 5
            and sum(val) = 0
       ) v
    on t1.id = v.id_t1
on-line проверка на sqlfiddle.com



Да все здорово, спасибо
28 май 15, 03:05    [17699135]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить