Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Распределить суммы по максимально приближенной сумме. / 17 сообщений из 17, страница 1 из 1
27.04.2017, 12:48
    #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
27.04.2017, 12:53
    #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
27.04.2017, 13:13
    #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
27.04.2017, 13:23
    #39445394
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распределить суммы по максимально приближенной сумме.
Есть подозрение что красиво решается для 12с с помощью patter matching,
но нет базы под рукой и вообще мне до отпуска осталось "работать" 2 часа.

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

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

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

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

У нас база 11. patter matching наверно не подойдет.
...
Рейтинг: 0 / 0
27.04.2017, 13:46
    #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
27.04.2017, 13:56
    #39445435
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Распределить суммы по максимально приближенной сумме.
dbms_photoshop
Код: plsql
1.
for i in reverse arr.count - 1 .. 1

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

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

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

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

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

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

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


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