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

Откуда:
Сообщений: 69
С помощью расчетов создается временная табличка следующего вида:

час значение
00 0
01 -1
02 -1
03 0
04 -1
05 -1 *
06 -1 *
07 -1
08 0
09 -1
...

Необходимо за каждый час выбрать значение 1, если за текущий час, за час назад и час вперед значение не нулевое
(отмечены *), иначе 0.
Как написать такой запрос?
27 фев 12, 12:00    [12155746]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по соседним полям  [new]
qwerty112
Guest
ptybn84.07
С помощью расчетов создается временная табличка следующего вида:

час значение
00 0
01 -1
02 -1
03 0
04 -1
05 -1 *
06 -1 *
07 -1
08 0
09 -1
...

Необходимо за каждый час выбрать значение 1, если за текущий час, за час назад и час вперед значение не нулевое
(отмечены *), иначе 0.
Как написать такой запрос?

where значение<>0
and exists(... where t2.час=t1.час+1 and t2.значение<>0)
and exists(... where t2.час=t1.час-1 and t2.значение<>0)
27 фев 12, 12:23    [12155955]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по соседним полям  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
WITH T AS
(
 SELECT * FROM
 (
  VALUES
   (0,0)
  ,(1,-1)
  ,(2,-1)
  ,(3,0)
  ,(4,-1)
  ,(5,-1)
  ,(6,-1)
  ,(7,-1)
  ,(8,0)
  ,(9,-1)
 ) T(час, значение)
)
SELECT T.час, T.значение,
ISNULL
(
 (
  SELECT 1 FROM
  (
             SELECT ABS(SIGN(T.значение))
   UNION ALL SELECT ABS(SIGN(T1.значение)) FROM  T T1 WHERE T1.час=T.час-1
   UNION ALL SELECT ABS(SIGN(T2.значение)) FROM  T T2 WHERE T2.час=T.час+1
  ) T(значение)
  HAVING SUM(значение)=3
 ),0
) значение
FROM T
ORDER BY час;
27 фев 12, 12:44    [12156146]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить