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

Откуда:
Сообщений: 31
Добрый день.
Подскажите, пожалуйста, имеет ли вообще смысл делать такое на SQL?
Есть такая таблица
Declare @t table (aID int, bID int, Cnt real)
insert into @t
select 1, 1 ,0.0 union all
select 2, null ,null union all
select 3, null ,null union all
select 4, null ,null union all
select 5, null ,null union all
select 6, null ,null union all
select 7, 7 ,4444 union all
select 8, null ,null union all
select 9, null ,null union all
select 10, 10 ,1234

Надо посчитать количество записей со значением NULL в поле Cnt между записями с ненулевым значением Cnt. Затем Значение Cnt разделить на количество записей и умножить на номер строки между ненулевыми значениями.
В результате должна получиться такая таблица

aID bID Cnt cntRec dtSumma
1 1 0 0 0
2 NULL NULL 1 222
3 NULL NULL 2 444
4 NULL NULL 3 666
5 NULL NULL 4 888
6 NULL NULL 5 1110
7 7 1332 6 1332
8 NULL NULL 1 411
9 NULL NULL 2 822
10 10 1233 3 1233
5 июн 19, 15:38    [21902662]     Ответить | Цитировать Сообщить модератору
 Re: Нутром чую, что литр.  [new]
nullin
Member

Откуда: pullin
Сообщений: 174
i-n-d-e-x, 2012+

select b.aID
     , b.bID
     , b.Cnt
     , b.cntRec
     , b.grCnt
     / max(b.cntRec) over(partition by b.nID)
     * b.cntRec as dtSumma
  from (select a.aID
             , a.bID
             , a.Cnt
             , a.nID
             , max(a.Cnt) over(partition by a.nID) as grCnt
             , row_number() over(partition by a.nID order by a.aID) as cntRec
          from (select t.aID
                     , t.bID
                     , t.Cnt
                     , min(t.bID) over(order by t.aID desc) as nID
                     , lag(t.bID, 1, null) over(partition by case
                                                              when t.bID is null then 0
                                                              else 1
                                                             end order by aID) as lID
                  from @t as t) as a) as b

 order by b.aID;
5 июн 19, 16:59    [21902765]     Ответить | Цитировать Сообщить модератору
 Re: Нутром чую, что литр.  [new]
i-n-d-e-x
Member

Откуда:
Сообщений: 31
Nullin, огромное спасибо. Красиво. Про LAG() и LEAD() даже не догадывался.
6 июн 19, 09:04    [21903131]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить