powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как просуммировать строки через оконые функции?
11 сообщений из 11, страница 1 из 1
Как просуммировать строки через оконые функции?
    #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
Как просуммировать строки через оконые функции?
    #40108654
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Focha,

Код: sql
1.
sum(<field for sum>) over (order by <field for order> rows between unbounded preceding and current row)
...
Рейтинг: 0 / 0
Как просуммировать строки через оконые функции?
    #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
Как просуммировать строки через оконые функции?
    #40108660
Фотография Focha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну делаю я накопительный итог, а дальше как?
...
Рейтинг: 0 / 0
Как просуммировать строки через оконые функции?
    #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
Как просуммировать строки через оконые функции?
    #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
Как просуммировать строки через оконые функции?
    #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
Как просуммировать строки через оконые функции?
    #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
Как просуммировать строки через оконые функции?
    #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
Как просуммировать строки через оконые функции?
    #40108854
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stdvb, да тут и проверять нечего - нет у этой задачи решения на оконках в общем случае. Focha, рекурсия там изи.
...
Рейтинг: 0 / 0
Как просуммировать строки через оконые функции?
    #40108886
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как просуммировать строки через оконые функции?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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