powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Распределить суммы по максимально приближенной сумме.
17 сообщений из 17, страница 1 из 1
Распределить суммы по максимально приближенной сумме.
    #39445372
amireyev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Распределить суммы по максимально приближенной сумме.

Добрый день.
Помогите сообразить, надо распределить суммы по максимально приближенной сумме. В 1-м приоритете распределяем,
всем по 1-й сумме, далее 2 и 3 приоритете докидываем тем у кого сумма наименьшая, что бы в конце сумма была максимально приближенная друг другу.

Если,
with summ
as
(
select 1 id, 1 prioritet, 1000000 as summa from dual
union all
select 1 id, 1 prioritet, 100000 as summa from dual
union all
select 1 id, 1 prioritet, 10000 as summa from dual
union all
select 1 id, 2 prioritet, 10000 as summa from dual
union all
select 1 id, 2 prioritet, 10000 as summa from dual
union all
select 1 id, 2 prioritet, 10000 as summa from dual
union all
select 1 id, 3 prioritet, 50000 as summa from dual
union all
select 1 id, 3 prioritet, 50000 as summa from dual
union all
select 1 id, 3 prioritet, 50000 as summa from dual
),
detki
as
(
select 1 id_s, 'Старший' as vozrost from dual
union all
select 1 id_s, 'Средний' as vozrost from dual
union all
select 1 id_s, 'Младший' as vozrost from dual
)
select VOZROST, summa
from detki, summ
where id_s = id
and prioritet =1

То нужно что бы результат был

Старший 1000000
Средний 100000
Младший 10000


Если,
with summ
as
(
select 1 id, 1 prioritet, 1000000 as summa from dual
union all
select 1 id, 1 prioritet, 100000 as summa from dual
union all
select 1 id, 1 prioritet, 10000 as summa from dual
union all
select 1 id, 2 prioritet, 10000 as summa from dual
union all
select 1 id, 2 prioritet, 10000 as summa from dual
union all
select 1 id, 2 prioritet, 10000 as summa from dual
union all
select 1 id, 3 prioritet, 50000 as summa from dual
union all
select 1 id, 3 prioritet, 50000 as summa from dual
union all
select 1 id, 3 prioritet, 50000 as summa from dual
),
detki
as
(
select 1 id_s, 'Старший' as vozrost from dual
union all
select 1 id_s, 'Средний' as vozrost from dual
union all
select 1 id_s, 'Младший' as vozrost from dual
)
select VOZROST, summa
from detki, summ
where id_s = id
and prioritet in (1, 2)

То нужно что бы результат был

Старший 1000000
Средний 100000
Младший 40000


Если,
with summ
as
(
select 1 id, 1 prioritet, 1000000 as summa from dual
union all
select 1 id, 1 prioritet, 100000 as summa from dual
union all
select 1 id, 1 prioritet, 10000 as summa from dual
union all
select 1 id, 2 prioritet, 10000 as summa from dual
union all
select 1 id, 2 prioritet, 10000 as summa from dual
union all
select 1 id, 2 prioritet, 10000 as summa from dual
union all
select 1 id, 3 prioritet, 50000 as summa from dual
union all
select 1 id, 3 prioritet, 50000 as summa from dual
union all
select 1 id, 3 prioritet, 50000 as summa from dual
),
detki
as
(
select 1 id_s, 'Старший' as vozrost from dual
union all
select 1 id_s, 'Средний' as vozrost from dual
union all
select 1 id_s, 'Младший' as vozrost from dual
)
select VOZROST, summa
from detki, summ
where id_s = id
and prioritet in (1, 2, 3)

То нужно что бы результат был

Старший 1000000
Средний 150000
Младший 140000
...
Рейтинг: 0 / 0
Распределить суммы по максимально приближенной сумме.
    #39445375
trace.log
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
amireyevРаспределить суммы по максимально приближенной сумме.

Добрый день.
Помогите сообразить, надо распределить суммы по максимально приближенной сумме. В 1-м приоритете распределяем,
всем по 1-й сумме, далее 2 и 3 приоритете докидываем тем у кого сумма наименьшая, что бы в конце сумма была максимально приближенная друг другу.
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
[/SRC]
Если,
with summ
as
(
select 1 id, 1 prioritet, 1000000 as summa from dual
union all
select 1 id, 1 prioritet, 100000 as summa from dual
union all
select 1 id, 1 prioritet, 10000 as summa from dual
union all
select 1 id, 2 prioritet, 10000 as summa from dual
union all
select 1 id, 2 prioritet, 10000 as summa from dual
union all
select 1 id, 2 prioritet, 10000 as summa from dual
union all
select 1 id, 3 prioritet, 50000 as summa from dual
union all
select 1 id, 3 prioritet, 50000 as summa from dual
union all
select 1 id, 3 prioritet, 50000 as summa from dual
),
detki
as
(
select 1 id_s, 'Старший' as vozrost from dual
union all
select 1 id_s, 'Средний' as vozrost from dual
union all
select 1 id_s, 'Младший' as vozrost from dual
)
select VOZROST, summa 
  from detki, summ  
 where id_s = id 
   and prioritet =1

То нужно что бы результат был

Старший	1000000
Средний	100000
Младший	10000


Если,
with summ
as
(
select 1 id, 1 prioritet, 1000000 as summa from dual
union all
select 1 id, 1 prioritet, 100000 as summa from dual
union all
select 1 id, 1 prioritet, 10000 as summa from dual
union all
select 1 id, 2 prioritet, 10000 as summa from dual
union all
select 1 id, 2 prioritet, 10000 as summa from dual
union all
select 1 id, 2 prioritet, 10000 as summa from dual
union all
select 1 id, 3 prioritet, 50000 as summa from dual
union all
select 1 id, 3 prioritet, 50000 as summa from dual
union all
select 1 id, 3 prioritet, 50000 as summa from dual
),
detki
as
(
select 1 id_s, 'Старший' as vozrost from dual
union all
select 1 id_s, 'Средний' as vozrost from dual
union all
select 1 id_s, 'Младший' as vozrost from dual
)
select VOZROST, summa 
  from detki, summ  
 where id_s = id 
   and prioritet in (1, 2)

То нужно что бы результат был

Старший	1000000
Средний	100000
Младший	40000


Если,
with summ
as
(
select 1 id, 1 prioritet, 1000000 as summa from dual
union all
select 1 id, 1 prioritet, 100000 as summa from dual
union all
select 1 id, 1 prioritet, 10000 as summa from dual
union all
select 1 id, 2 prioritet, 10000 as summa from dual
union all
select 1 id, 2 prioritet, 10000 as summa from dual
union all
select 1 id, 2 prioritet, 10000 as summa from dual
union all
select 1 id, 3 prioritet, 50000 as summa from dual
union all
select 1 id, 3 prioritet, 50000 as summa from dual
union all
select 1 id, 3 prioritet, 50000 as summa from dual
),
detki
as
(
select 1 id_s, 'Старший' as vozrost from dual
union all
select 1 id_s, 'Средний' as vozrost from dual
union all
select 1 id_s, 'Младший' as vozrost from dual
)
select VOZROST, summa 
  from detki, summ  
 where id_s = id 
   and prioritet in (1, 2,  3)



То нужно что бы результат был

Старший 1000000
Средний 150000
Младший 140000
...
Рейтинг: 0 / 0
Распределить суммы по максимально приближенной сумме.
    #39445388
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amireyev,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
set serveroutput on

declare
   big     int := 0;
   med     int := 0;
   small   int := 0;
begin

   for i in
   (
   select * from
   (
     select 1 id, 1 prioritet, 1000000 as summa from dual
     union all
     select 1 id, 1 prioritet, 100000 as summa from dual
     union all
     select 1 id, 1 prioritet, 10000 as summa from dual
     union all
     select 1 id, 2 prioritet, 10000 as summa from dual
     union all
     select 1 id, 2 prioritet, 10000 as summa from dual
     union all
     select 1 id, 2 prioritet, 10000 as summa from dual
     union all
     select 1 id, 3 prioritet, 50000 as summa from dual
     union all
     select 1 id, 3 prioritet, 50000 as summa from dual
     union all
     select 1 id, 3 prioritet, 50000 as summa from dual   
   )
   where prioritet in (1,2,3)
   )
   loop

      if small + i.summa > med
      then
         if med + i.summa > big
         then
            big   := big + i.summa;
         else
            med   := med + i.summa;
         end if;
      else
         small   := small + i.summa;
      end if;
   end loop;

   dbms_output.put_line(big);
   dbms_output.put_line(med);
   dbms_output.put_line(small);

end;
/



Чистым SQL решается model и rec with, но я не буду помогать выстрелить себе в ногу.
...
Рейтинг: 0 / 0
Распределить суммы по максимально приближенной сумме.
    #39445394
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть подозрение что красиво решается для 12с с помощью patter matching,
но нет базы под рукой и вообще мне до отпуска осталось "работать" 2 часа.

xtender позже напишет решение через match_recognize, зуб даю.
...
Рейтинг: 0 / 0
Распределить суммы по максимально приближенной сумме.
    #39445403
amireyev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop,
Спасибо, а как быть если я точно не знаю, количество распределения. То есть, я как пример взял троих
(Старший, Средний, Младший). У тебя это (big, med, small),
а мне надо брать с таблицы и там может быть разное количество.
...
Рейтинг: 0 / 0
Распределить суммы по максимально приближенной сумме.
    #39445405
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amireyev,

Я написал алгоритм "просеивания" (название выдумано на ходу).
Если он годится для твоей задачи - то для большего числа групп просто IFы будут ветвистее.
...
Рейтинг: 0 / 0
Распределить суммы по максимально приближенной сумме.
    #39445409
amireyev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop,

проблема в том, что я не знаю точное количество групп, они могут меняться, вот этот момент не совсем понятен.
...
Рейтинг: 0 / 0
Распределить суммы по максимально приближенной сумме.
    #39445410
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopдля большего числа групп просто IFы будут ветвистее.Или просто вложенный цикл, если число групп заранее неизветсно.
Но тогда паттерн матчингом не решится.
...
Рейтинг: 0 / 0
Распределить суммы по максимально приближенной сумме.
    #39445412
amireyev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop,

Можно пример, Спасибо
...
Рейтинг: 0 / 0
Распределить суммы по максимально приближенной сумме.
    #39445417
amireyev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop,

У нас база 11. patter matching наверно не подойдет.
...
Рейтинг: 0 / 0
Распределить суммы по максимально приближенной сумме.
    #39445425
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amireyev,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
declare
   arr   sys.odcinumberlist := sys.odcinumberlist(0, 0, 0);
begin

   for i in (select ... order by summa desc)
   loop

      for i in reverse arr.count - 1 .. 1
      loop
        ...
      end loop;

   end loop;

end;
/



Дальше додумаешься один if написать?

В массиве элементы от большого к маленькому.
...
Рейтинг: 0 / 0
Распределить суммы по максимально приближенной сумме.
    #39445435
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop
Код: plsql
1.
for i in reverse arr.count - 1 .. 1

Видно мало практики в обратных циклах :)
...
Рейтинг: 0 / 0
Распределить суммы по максимально приближенной сумме.
    #39445452
amireyev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

Если не трудно, можно ваш вариант. Спасибо
...
Рейтинг: 0 / 0
Распределить суммы по максимально приближенной сумме.
    #39445467
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

Хаха, да признаю, не использовал уже давно. :)
...
Рейтинг: 0 / 0
Распределить суммы по максимально приближенной сумме.
    #39446465
amireyev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть еще варианты?
...
Рейтинг: 0 / 0
Распределить суммы по максимально приближенной сумме.
    #39446476
amireyev,

Так ты бы озвучивал точные критерии или что именно не устраивает.

Например для чисел 6, 5, 4 и двух групп подход выше даст 10 и 5 а может ты ожидаешь 9 и 6.

Читай про задачи на оптимизацию и динамическое программирование.
...
Рейтинг: 0 / 0
Распределить суммы по максимально приближенной сумме.
    #39446490
amireyev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привидение фотошопа,

Долгое время не работал с PL SQL, 2-й день гуглю, но так и не получается (((((.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Распределить суммы по максимально приближенной сумме.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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