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

Откуда: glubinka
Сообщений: 4256
задача вроде несложная - значения счетчиков с датчиков заполнить значением которое было до первого null.

То есть в итоге: 15, 15, 15, 15, 10, 10, 20, 25, 25, 7

declare @tbl table (id int, cnt int, dt datetime)

insert into @tbl (id, cnt, dt) values (1, 15   , '2010/01/01')
insert into @tbl (id, cnt, dt) values (2, null, '2010/01/10')
insert into @tbl (id, cnt, dt) values (3, null, '2010/01/20')
insert into @tbl (id, cnt, dt) values (4, null, '2010/01/30')
insert into @tbl (id, cnt, dt) values (6, 10,   '2010/02/01')
insert into @tbl (id, cnt, dt) values (8, null, '2010/02/10')
insert into @tbl (id, cnt, dt) values (9, 20,   '2010/02/28')
insert into @tbl (id, cnt, dt) values (10,25,   '2010/03/01')
insert into @tbl (id, cnt, dt) values (11, null, '2010/03/10')
insert into @tbl (id, cnt, dt) values (14, 7,    '2010/03/20')


вроде получил результируюший набор, но не вижу как сгрупировать-отфильтровать

;WITH cte AS
( 
  select t.id, t.cnt, t.dt, Row_Number()OVER(ORDER BY dt) as num
    from @tbl t
)
  select * from cte ,
     ( select t.id as tid, t.cnt as tcnt, t.dt as tdt, n.id as nid, n.cnt as ncnt, n.dt as ndt 
         from cte t, cte n where t.cnt is null and n.cnt is not null and n.num = t.num - 1 )a
  where cte.cnt is null 


Спасибо
5 фев 15, 21:30    [17225264]     Ответить | Цитировать Сообщить модератору
 Re: дырки но не совсем на растушем но не на монотонном интервале  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
Lepsik,

select *,prev.M
from @tbl t
cross apply (select top 1 M=cnt from @tbl where dt < t.dt order by dt asc)prev
5 фев 15, 21:47    [17225306]     Ответить | Цитировать Сообщить модератору
 Re: дырки но не совсем на растушем но не на монотонном интервале  [new]
invm
Member

Откуда: Москва
Сообщений: 9724
select
 t.id, isnull(t.cnt, a.cnt), t.dt
from
 @tbl t outer apply
 (select top (1) cnt from @tbl where id < t.id and cnt is not null order by id desc) a(cnt);
5 фев 15, 21:50    [17225314]     Ответить | Цитировать Сообщить модератору
 Re: дырки но не совсем на растушем но не на монотонном интервале  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
Lepsik,

вот так точнее будет
SELECT *
FROM @tbl t
cross apply (select top 1 M=cnt from @tbl where dt <= t.dt AND cnt IS NOT NULL order by dt desc)prev
ORDER BY id
5 фев 15, 21:53    [17225329]     Ответить | Цитировать Сообщить модератору
 Re: дырки но не совсем на растушем но не на монотонном интервале  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
gds
Lepsik,

вот так точнее будет
SELECT *
FROM @tbl t
cross apply (select top 1 M=cnt from @tbl where dt <= t.dt AND cnt IS NOT NULL order by dt desc)prev
ORDER BY id


ORDER BY id - можно убрать и второе. относительно чего вам надо последнее значение? даты или id? то и ставьте условие cross apply
5 фев 15, 21:58    [17225346]     Ответить | Цитировать Сообщить модератору
 Re: дырки но не совсем на растушем но не на монотонном интервале  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
Cool. Thanks
5 фев 15, 22:21    [17225410]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить