powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Возможно ли такое с помощью SQL?
40 сообщений из 40, показаны все 2 страниц
Возможно ли такое с помощью SQL?
    #33901836
danilov_vo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый господа!
Есть таблица с количеством записей порядка 20-30, например table1 , которая в свою очередь имеет числовое поле, например field1 . И есть диапазон значений, например min и max . Необходимо выбрать как можно меньше записей из table1 , при этом их общая сумма по полю field1 должна быть больше min и меньше max .
Подскажите плиз, каким образом это можно сделать с наименьшими затратами производительности, возможно это и просто, но мне что-то не видится решения без применения PL/SQL.. да и там неясность пока..
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33901838
danilov_vo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЗЫ: подойдет любая информация, линки..
Заранее спасибо..
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33901865
Birkhoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По моему любая одна запись с min<field1<max удовлетворяет условию задачи?
Или я что-то упустил?
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33901882
danilov_vo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BirkhoffПо моему любая одна запись с min<field1<max удовлетворяет условию задачи?
Или я что-то упустил?

не факт.. Допустим min = 600 max = 650
а в таблице 4 записи (простейший вариант) со значением поля field1:
для 1-ой 400, 2-я - 300, 3-я - 200, 4-ая - 100... так в результат дожны попасть 1-ая и 3-я запись... хех..
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33901886
danilov_vo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЗЫ: эти две записи в сумме дают необходимые 600, и их всего две в отличии от варианта когда 2-ая, 3-ая и 4-ая также в сумме дают необходимый min..
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33901890
__vvp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для 9+

Код: plaintext
1.
2.
3.
select field1, summ
from (select field1, sum(field1) over (order by field1 desc) summ
      from table1)
where summ <= min

Только условие во where подправь чуть
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33901891
danilov_vo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BirkhoffПо моему любая одна запись с min<field1<max удовлетворяет условию задачи?
Или я что-то упустил?

млин, туплю уже сижу... да, совершенно верно! но, что делать когда не будет такой записи?
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33901892
danilov_vo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__vvp_Для 9+

Код: plaintext
1.
2.
3.
select field1, summ
from (select field1, sum(field1) over (order by field1 desc) summ
      from table1)
where summ <= min

Только условие во where подправь чуть

сиб.. буду пробовать..
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33901893
danilov_vo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не катит((
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33901897
__vvp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работает с 8.1.6. - поправка :)

В результате работы этого запроса не хватит одной строки, если итоговая сумма <> min, если равна, то катит. Вот это и допиши
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33901902
danilov_vo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__vvp_Работает с 8.1.6. - поправка :)

В результате работы этого запроса не хватит одной строки, если итоговая сумма <> min, если равна, то катит. Вот это и допиши

Ну ды получается тогда, что если сумма <> min (1-й вариант), то мне опять придется набирать записи, но только уже на сумму min - итоговая сумма...
Если я правильно понял конечно... это не годится..
Да и, field1 в записях может равняться как 100, так и 10000000, соответсвенно и min, max может быть 10-12, или 10-1000000... если поможет кому..
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33901904
__vvp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
select field1, summ
from (select field1, sum(field1) over (order by field1 desc) summ,
                     lead(field1,  1 ,  0 ) over (order by field1 desc) ld
      from table1)
where (summ <= min or summ < min + ld) and summ <= max
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33901917
__vvp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
Загрузил... :). Последняя поправка

select field1
from (select field1, sum(field1) over (order by field1 desc) summ,
                     lead(field1,  1 ,  0 ) over (order by field1 desc) ld
      from table1)
where (summ <= min + ld) and summ <= max
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33901918
danilov_vo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
то же самое(( выдает в результат только 400...
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33901921
danilov_vo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хех... и это также не выдает необходимого((
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33901923
__vvp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Действительно, не то. Тут же не по порядку убывания надо....
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33901927
__vvp_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут только PL/SQL.

1. Взять максимальное значение field1 из диапазона
2. Найти второй field1, значение которого в сумме с первым даст значение не больше max
и т.д.
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33901932
danilov_vo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__vvp_Тут только PL/SQL.

1. Взять максимальное значение field1 из диапазона
2. Найти второй field1, значение которого в сумме с первым даст значение не больше max
и т.д.

вот меня и страшит это "так далее"...
как видно из примера, как раз запись с максимальным field1 и не подходит..
я уже голову сломал(( и книги толковой нет.. на Delphi, или C, я думаю это не сложно было бы нарисовать рекурсией, и то не факт, не пробовал... а тут.. я вообще запутался((
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33902025
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
danilov_voЕсть таблица с количеством записей порядка 20-30, например table1 , которая в свою очередь имеет числовое поле, например field1 . И есть диапазон значений, например min и max . Необходимо выбрать как можно меньше записей из table1 , при этом их общая сумма по полю field1 должна быть больше min и меньше max .
STFF запрос для подсчета суммы чисел и проверки соответствия суммы данному числу, для начала :)
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33902169
Владимир Бегун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
danilov_voЗЫ: подойдет любая информация, линки..
http://vbegun.blogspot.com/2005/11/sql-puzzle-iii.html
Код: plaintext
1.
2.
3.
-- 
Vladimir Begun       |  http://alexeymazanov.narod.ru/ 
The statements and opinions expressed here are my own
and do not necessarily represent those of Oracle. 
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33902411
Mikst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не забывайте про слечай например для min=600 max=650
из ряда чисел 550 450 350 250 151

т.е. сумма 550+151 уже больше.
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33902503
ksm80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select * 
  from (select num, 
--             max(num) over() max_num, 
	       sum(num) over(order by num desc rows between unbounded preceding and current row) cur_sum 
          from test
         where num< 500  and num> 100 ) 
 where cur_sum< 500   



-- crete table test (num number)
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33902645
danilov_vo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем откликнувшимся огромное спасибо! В виду огранечения по времени выполнения задачи решил все-таки сделать средствами PL/SQL, причем без условия "как можно меньше записей "... думаю, что это намного повысит производительность..
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33902726
ksm80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для того что бы перебрать все возможные значения - тебе надо цикл от 1 до 2^n степени, где n - количество элементов, удовлетворяющих условию. Условие "как можно меньше записей" и "первое попавшиеся" предполагает как можно быстрейший выход из цикла.
Теоретически возможен вариант кода тебе прийдёться перебрать весь массив, а для 30 элементов это 1.073.741.824, вообщем шахматы
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33902737
Mikst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ksm80Для того что бы перебрать все возможные значения - тебе надо цикл от 1 до 2^n степени, где n - количество элементов, удовлетворяющих условию. Условие "как можно меньше записей" и "первое попавшиеся" предполагает как можно быстрейший выход из цикла.
Теоретически возможен вариант кода тебе прийдёться перебрать весь массив, а для 30 элементов это 1.073.741.824, вообщем шахматы

Перебирать весь массив это конечно вариант. но уж больно долго.

Если нужно условие "как можно меньше записей" - можно попробовать примерно такой алгоритм: ищем сначала одну запись, если такой нет, то ищем подходящую пару, ну и т.д. опять же на ПЛСКЛ
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33902746
Stax.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
danilov_voЗЫ: подойдет любая информация, линки..
Заранее спасибо..
вот еще ЛЮБАЯ сцылка
......
stax
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33902777
RRA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. формулировка задачи не совсем понятна, но так как тема интересная предлагаю свой вариант:

Код: plaintext
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.
Select
  *
From
(  
Select
  B1.N_Min,
  B2.N_Max
From  
  (Select
    Min(N) Over (Partition By 1) As Min,
    N As N_Min 
  From  
   (Select Level As N From Dual Connect By Level<=500) A1
  Where 
    A1.N between 100 And 300  
  Order By N) B1,
  ---------------------------------  
  (Select
    Max(N) Over (Partition By 1) As Max,
    N As N_Max 
  From  
   (Select Level As N From Dual Connect By Level<=500) A1
  Where 
    A1.N between 100 And 300    
  Order By N Desc) B2
Where
  B1.N_Min+B2.N_Max Between B1.Min And B2.Max
Order By B1.N_Min+B2.N_Max desc
)
Where RowNum<=5    
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33902801
contr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем приводившим ссылки сорри - сходить не мог, поэтому решения приводить не стану, но, прикола ради:
Код: plaintext
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.
SQL> var s_from number;
SQL> var s_to number;
SQL> exec :s_from :=  601 ; :s_to :=  650 ;

PL/SQL procedure successfully completed
s_from
---------
 601 
s_to
---------
 650 

SQL> with tab as (
   2   select  550  val from dual union all
   3   select  450  from dual union all
   4   select  350  from dual union all
   5   select  250  from dual union all
   6   select  151  from dual)
   7   select *
   8   from (select val, summ, dense_rank() over(order by r) R
   9          from (select val, sum(val) over(partition by r) summ, r
  10                 from (select val,
  11                               power( 2 , (row_number() over(order by val desc) -  1 )) rn
  12                        from tab) t,
  13                      (select rownum r from dual connect by level <  100 ) p
  14                 where bitand(rn, r) >  0 )
  15          where summ between :s_from and :s_to)
  16   where R =  1 ;

       VAL       SUMM          R
---------- ---------- ----------
        450          601            1 
        151          601            1 
s_from
---------
 601 
s_to
---------
 650 

SQL> 
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33902855
RRA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
Create View Тест As
  select 550 As N from dual union all
  select 450 As N from dual union all
  select 350 As N from dual union all
  select 250 As N from dual union all
  select 151 As N from dual;
-----------------------------------------
Select 
  *
From
 (Select
    B1.N_Min,
    B2.N_Max
  From  
    (Select
      Min(N) Over (Partition By 1) As Min,
      N As N_Min 
    From  
      Тест A1
    Order By N) B1,
    ---------------------------------  
    (Select
      Max(N) Over (Partition By 1) As Max,
      N As N_Max 
    From  
      Тест A1
    Order By N Desc) B2
  Where
    B1.N_Min+B2.N_Max Between 601 And 650
  Order By B1.N_Min+B2.N_Max desc)
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #33906292
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RRA
Код: plaintext
1.
2.
  Where
    B1.N_Min+B2.N_Max Between  601  And  650 
Твоё мировоззрение ограничено только двумя слагаемыми?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Возможно ли такое с помощью SQL?
    #39633427
Zahar H.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WITH x AS (
SELECT ROWNUM*100 n
FROM dual
CONNECT BY LEVEL<=4
), y(str, sm, lvl) AS (
SELECT TO_CHAR(MAX(n)), MAX(n), 1
FROM x
WHERE n <= 650
UNION ALL
SELECT y.str || ',' || x.n, y.sm+x.n, y.lvl+1
FROM x, y
WHERE NOT ',' || y.str || ',' LIKE '%,' || n || ',%'
AND y.sm+x.n <=650 AND y.sm<600
)
SELECT MAX(str) KEEP(DENSE_RANK FIRST ORDER BY lvl DESC, sm DESC) str
FROM y
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #39633428
Zahar H.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to be more accurate:

WITH x AS (
select 550 As N from dual union all
select 450 As N from dual union all
select 350 As N from dual union all
select 250 As N from dual union all
select 151 As N from dual
), y(str, sm, lvl) AS (
SELECT TO_CHAR(n), n, 1
FROM x
WHERE n <= 650
UNION ALL
SELECT y.str || ',' || x.n, y.sm+x.n, y.lvl+1
FROM x, y
WHERE NOT ',' || y.str || ',' LIKE '%,' || n || ',%'
AND y.sm+x.n <=650 AND y.sm<600
)
SELECT MAX(str) KEEP(DENSE_RANK FIRST ORDER BY lvl DESC, sm DESC) str
FROM y

this gives:

STR
------
450,151

Is that what you needed?
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #39633431
Zahar H.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
This one is a bit better:

WITH x AS (
select 550 As N from dual union all
select 450 As N from dual union all
select 350 As N from dual union all
select 250 As N from dual union all
select 151 As N from dual
), y(str, sm, lvl) AS (
SELECT TO_CHAR(n), n, 1
FROM x
WHERE n <= 650
UNION ALL
SELECT y.str || ',' || x.n, y.sm+x.n, y.lvl+1
FROM x, y
WHERE NOT ',' || y.str || ',' LIKE '%,' || n || ',%'
AND y.sm+x.n <=650 AND y.sm<600
)
SELECT MAX(str) KEEP(DENSE_RANK FIRST ORDER BY lvl, sm DESC) str
FROM y
WHERE sm>=600
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #39633433
Zahar H.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yet one more (optimized) version:

WITH x AS (
select 550 As N from dual union all
select 450 As N from dual union all
select 350 As N from dual union all
select 250 As N from dual union all
select 151 As N from dual
), y(str, sm, lvl, prev) AS (
SELECT TO_CHAR(n), n, 1, n
FROM x
WHERE n <= 650
UNION ALL
SELECT y.str || ',' || x.n, y.sm+x.n, y.lvl+1, x.n
FROM x, y
WHERE NOT ',' || y.str || ',' LIKE '%,' || n || ',%'
AND y.sm+x.n <=650 AND y.sm<600
AND x.n<y.prev
)
SELECT MAX(str) KEEP(DENSE_RANK FIRST ORDER BY lvl, sm DESC) str
FROM y
WHERE sm>=600
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #39633490
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
WITH x AS (
SELECT ROWNUM n FROM dual
connect BY ROWNUM < 501
),
 y(str, sm, lvl, PREV) AS (
SELECT TO_CHAR(n), n, 1, n
FROM x
WHERE n <= 650
UNION ALL
SELECT y.str || ',' || x.n, y.sm+x.n, y.lvl+1, x.n
FROM x, y
WHERE NOT ',' || y.str || ',' LIKE '%,' || n || ',%'
AND y.sm+x.n <=650 AND y.sm<600
AND x.n<y.prev
)
SELECT MAX(str) KEEP(DENSE_RANK FIRST ORDER BY lvl, sm DESC) str
FROM y
WHERE sm>=600


ORA-01652: невозможно увеличить временный сегмент до 128 в разделе TEMP
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #39633491
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zahar H.Is that what you needed?Янки, как у тебя с логикой и ощущением своевременности?
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #39633642
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__vvp_,
Нужно найти сочетания строк, может стоит сначала объединить, посчитать суммы и после фильтровать?
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #39633673
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMLer__vvp_,
Нужно найти сочетания строк, может стоит сначала объединить, посчитать суммы и после фильтровать?сколько это будет комбинаций для 500 исходных строк?
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #39633738
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx,
много. пугает?
...
Рейтинг: 0 / 0
Возможно ли такое с помощью SQL?
    #39633757
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxXMLer__vvp_,
Нужно найти сочетания строк, может стоит сначала объединить, посчитать суммы и после фильтровать?сколько это будет комбинаций для 500 исходных строк?
Код: plaintext
3 273 390 607 896 141 870 013 189 696 827 599 152 216 642 046 043 064 789 483 291 368 096 133 796 404 674 554 883 270 092 325 904 157 150 886 684 127 560 071 009 217 256 545 885 393 053 328 527 589 375
Ты столько же насчитал?
...
Рейтинг: 0 / 0
40 сообщений из 40, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Возможно ли такое с помощью SQL?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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