Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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 разделить на количество записей и умножить на номер строки между ненулевыми значениями. В результате должна получиться такая таблица
|
5 июн 19, 15:38 [21902662] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
i-n-d-e-x Member Откуда: Сообщений: 31 |
Nullin, огромное спасибо. Красиво. Про LAG() и LEAD() даже не догадывался. |
6 июн 19, 09:04 [21903131] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |