Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нутром чую, что литр. / 3 сообщений из 3, страница 1 из 1
05.06.2019, 15:38
    #39822910
i-n-d-e-x
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нутром чую, что литр.
Добрый день.
Подскажите, пожалуйста, имеет ли вообще смысл делать такое на 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 разделить на количество записей и умножить на номер строки между ненулевыми значениями.
В результате должна получиться такая таблица
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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
...
Рейтинг: 0 / 0
05.06.2019, 16:59
    #39822967
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нутром чую, что литр.
i-n-d-e-x, 2012+

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
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;
...
Рейтинг: 0 / 0
06.06.2019, 09:04
    #39823223
i-n-d-e-x
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нутром чую, что литр.
Nullin, огромное спасибо. Красиво. Про LAG() и LEAD() даже не догадывался.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нутром чую, что литр. / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]