Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как просуммировать строки через оконые функции? / 11 сообщений из 11, страница 1 из 1
01.11.2021, 16:45
    #40108647
Focha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как просуммировать строки через оконые функции?
Есть таблица
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select 667754 as route_map_id,5000 as carrying_capacity_kg	,33.800 as freight_kg	,10729.292 as total_freight_kg	  union all
select 667752				 ,5000							,41.332					,10729.292						  union all
select 667796				 ,5000							,300.800				,10729.292						  union all
select 667751				 ,5000							,1051.596				,10729.292						  union all
select 667749				 ,5000							,1686.516				,10729.292						  union all
select 667750				 ,5000							,2050.466				,10729.292						  union all
select 667747				 ,5000							,2753.580				,10729.292						  union all
select 667748				 ,5000							,2811.202				,10729.292	


Нужно просуммировать строки, начиная с меньшего веса и когда следующая строка будет превышать 5000, начать сложение с текущей строки. Что-то не могу решить через оконные функции.
Результат вот такой
...
Рейтинг: 0 / 0
01.11.2021, 16:50
    #40108654
Двоичник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как просуммировать строки через оконые функции?
Focha,

Код: sql
1.
sum(<field for sum>) over (order by <field for order> rows between unbounded preceding and current row)
...
Рейтинг: 0 / 0
01.11.2021, 16:54
    #40108657
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как просуммировать строки через оконые функции?
Двоичник
Focha,

Код: sql
1.
sum(<field for sum>) over (order by <field for order> rows between unbounded preceding and current row)



Выделенное - это поведение по умолчанию, при наличии order by
Т.е. ваш код эквивалентен


Код: sql
1.
sum(<field for sum>) over (order by <field for order>)
...
Рейтинг: 0 / 0
01.11.2021, 16:58
    #40108660
Focha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как просуммировать строки через оконые функции?
Ну делаю я накопительный итог, а дальше как?
...
Рейтинг: 0 / 0
01.11.2021, 17:04
    #40108661
Focha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как просуммировать строки через оконые функции?
ну типа дальше группа сложить, вроде работает. Уровней не так много
Код: 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.
with  t as
(

select 667754 as route_map_id,5000 as carrying_capacity_kg	,33.800 as freight_kg	,10729.292 as total_freight_kg	  union all
select 667752				 ,5000							,41.332					,10729.292						  union all
select 667796				 ,5000							,300.800				,10729.292						  union all
select 667751				 ,5000							,1051.596				,10729.292						  union all
select 667749				 ,5000							,1686.516				,10729.292						  union all
select 667750				 ,5000							,2050.466				,10729.292						  union all
select 667747				 ,5000							,2753.580				,10729.292						  union all
select 667748				 ,5000							,2811.202				,10729.292

)

select * 
		,case 
				when sum(t.freight_kg) over (order by t.freight_kg) < t.carrying_capacity_kg
				then 1 
				when sum(t.freight_kg) over (order by t.freight_kg) < t.carrying_capacity_kg * 2
				then 2 
				when sum(t.freight_kg) over (order by t.freight_kg) < t.carrying_capacity_kg * 3
				then 3 
		 end 
from t
...
Рейтинг: 0 / 0
01.11.2021, 19:23
    #40108692
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как просуммировать строки через оконые функции?
msLex
Двоичник
Focha,

Код: sql
1.
sum(<field for sum>) over (order by <field for order> rows between unbounded preceding and current row)



Выделенное - это поведение по умолчанию, при наличии order by
Т.е. ваш код эквивалентен


Код: sql
1.
sum(<field for sum>) over (order by <field for order>)


По умолчанию range
...
Рейтинг: 0 / 0
01.11.2021, 21:54
    #40108716
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как просуммировать строки через оконые функции?
Focha,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
with a as 
(select 5000 cut, row_number() over(order by freight_kg) n, freight_kg kg
 from #a)

, r as 
(select 0 rng, n, kg, convert(decimal(18,6), 0) kgs, 0 group_id
 from a
 where n = 1

  union all

   select r.rng + 1 rng, a.n, a.kg, 
          convert(decimal(18, 6), iif(a.cut >= r.kgs + a.kg, r.kgs, 0) + a.kg) kgs, 
          r.group_id + iif(a.cut >= r.kgs + a.kg, 0, 1) group_id
   from r 
   inner join a 
   on a.n = r.rng + 1)

select r.n, r.group_id, r.kgs, r.kg
from r
where r.rng > 0
order by r.n
...
Рейтинг: 0 / 0
02.11.2021, 17:43
    #40108827
Focha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как просуммировать строки через оконые функции?
nullin, ваше решение через рекурсию это жесть

Вот решение
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select *, sum(freight_kg) over (partition by d.group_id)
from (
select *, floor( sum(d.freight_kg) over (order by d.freight_kg) / d.carrying_capacity_kg) as group_id

from (

select 667754 as route_map_id,5000 as carrying_capacity_kg	,33.800 as freight_kg	,10729.292 as total_freight_kg	  union all
select 667752				 ,5000							,41.332					,10729.292						  union all
select 667796				 ,5000							,300.800				,10729.292						  union all
select 667751				 ,5000							,1051.596				,10729.292						  union all
select 667749				 ,5000							,1686.516				,10729.292						  union all
select 667750				 ,5000							,2050.466				,10729.292						  union all
select 667747				 ,5000							,2753.580				,10729.292						  union all
select 667748				 ,5000							,2811.202				,10729.292) as d ) as d
...
Рейтинг: 0 / 0
02.11.2021, 18:06
    #40108831
stdvb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как просуммировать строки через оконые функции?
Focha
nullin, ваше решение через рекурсию это жесть


А ваше - неправильное. Проверьте:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select *, sum(freight_kg) over (partition by d.group_id)
from (
select *, floor( sum(d.freight_kg) over (order by d.freight_kg) / d.carrying_capacity_kg) as group_id

from (

select 667754 as route_map_id,5000 as carrying_capacity_kg	,2000 as freight_kg	union all
select 667752				 ,5000							,3000 union all
select 667796				 ,5000							,4000) as d ) as d
...
Рейтинг: 0 / 0
02.11.2021, 21:29
    #40108854
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как просуммировать строки через оконые функции?
stdvb, да тут и проверять нечего - нет у этой задачи решения на оконках в общем случае. Focha, рекурсия там изи.
...
Рейтинг: 0 / 0
03.11.2021, 08:15
    #40108886
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как просуммировать строки через оконые функции?
-
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как просуммировать строки через оконые функции? / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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