|
|
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
День добрый господа! Есть таблица с количеством записей порядка 20-30, например table1 , которая в свою очередь имеет числовое поле, например field1 . И есть диапазон значений, например min и max . Необходимо выбрать как можно меньше записей из table1 , при этом их общая сумма по полю field1 должна быть больше min и меньше max . Подскажите плиз, каким образом это можно сделать с наименьшими затратами производительности, возможно это и просто, но мне что-то не видится решения без применения PL/SQL.. да и там неясность пока.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2006, 16:29 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
ЗЫ: подойдет любая информация, линки.. Заранее спасибо.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2006, 16:30 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
По моему любая одна запись с min<field1<max удовлетворяет условию задачи? Или я что-то упустил? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2006, 17:44 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
BirkhoffПо моему любая одна запись с min<field1<max удовлетворяет условию задачи? Или я что-то упустил? не факт.. Допустим min = 600 max = 650 а в таблице 4 записи (простейший вариант) со значением поля field1: для 1-ой 400, 2-я - 300, 3-я - 200, 4-ая - 100... так в результат дожны попасть 1-ая и 3-я запись... хех.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2006, 18:46 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
ЗЫ: эти две записи в сумме дают необходимые 600, и их всего две в отличии от варианта когда 2-ая, 3-ая и 4-ая также в сумме дают необходимый min.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2006, 18:49 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
Для 9+ Код: plaintext 1. 2. 3. Только условие во where подправь чуть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2006, 19:01 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
BirkhoffПо моему любая одна запись с min<field1<max удовлетворяет условию задачи? Или я что-то упустил? млин, туплю уже сижу... да, совершенно верно! но, что делать когда не будет такой записи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2006, 19:02 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
__vvp_Для 9+ Код: plaintext 1. 2. 3. Только условие во where подправь чуть сиб.. буду пробовать.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2006, 19:04 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
не катит(( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2006, 19:08 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
Работает с 8.1.6. - поправка :) В результате работы этого запроса не хватит одной строки, если итоговая сумма <> min, если равна, то катит. Вот это и допиши ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2006, 19:12 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
__vvp_Работает с 8.1.6. - поправка :) В результате работы этого запроса не хватит одной строки, если итоговая сумма <> min, если равна, то катит. Вот это и допиши Ну ды получается тогда, что если сумма <> min (1-й вариант), то мне опять придется набирать записи, но только уже на сумму min - итоговая сумма... Если я правильно понял конечно... это не годится.. Да и, field1 в записях может равняться как 100, так и 10000000, соответсвенно и min, max может быть 10-12, или 10-1000000... если поможет кому.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2006, 19:19 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2006, 19:28 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2006, 19:43 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
то же самое(( выдает в результат только 400... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2006, 19:43 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
хех... и это также не выдает необходимого(( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2006, 19:45 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
Действительно, не то. Тут же не по порядку убывания надо.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2006, 19:50 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
Тут только PL/SQL. 1. Взять максимальное значение field1 из диапазона 2. Найти второй field1, значение которого в сумме с первым даст значение не больше max и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2006, 19:57 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
__vvp_Тут только PL/SQL. 1. Взять максимальное значение field1 из диапазона 2. Найти второй field1, значение которого в сумме с первым даст значение не больше max и т.д. вот меня и страшит это "так далее"... как видно из примера, как раз запись с максимальным field1 и не подходит.. я уже голову сломал(( и книги толковой нет.. на Delphi, или C, я думаю это не сложно было бы нарисовать рекурсией, и то не факт, не пробовал... а тут.. я вообще запутался(( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2006, 20:01 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
danilov_voЕсть таблица с количеством записей порядка 20-30, например table1 , которая в свою очередь имеет числовое поле, например field1 . И есть диапазон значений, например min и max . Необходимо выбрать как можно меньше записей из table1 , при этом их общая сумма по полю field1 должна быть больше min и меньше max . STFF запрос для подсчета суммы чисел и проверки соответствия суммы данному числу, для начала :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2006, 23:20 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
danilov_voЗЫ: подойдет любая информация, линки.. http://vbegun.blogspot.com/2005/11/sql-puzzle-iii.html Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2006, 08:46 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
Не забывайте про слечай например для min=600 max=650 из ряда чисел 550 450 350 250 151 т.е. сумма 550+151 уже больше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2006, 10:56 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2006, 11:28 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
Всем откликнувшимся огромное спасибо! В виду огранечения по времени выполнения задачи решил все-таки сделать средствами PL/SQL, причем без условия "как можно меньше записей "... думаю, что это намного повысит производительность.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2006, 12:06 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
Для того что бы перебрать все возможные значения - тебе надо цикл от 1 до 2^n степени, где n - количество элементов, удовлетворяющих условию. Условие "как можно меньше записей" и "первое попавшиеся" предполагает как можно быстрейший выход из цикла. Теоретически возможен вариант кода тебе прийдёться перебрать весь массив, а для 30 элементов это 1.073.741.824, вообщем шахматы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2006, 12:28 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
ksm80Для того что бы перебрать все возможные значения - тебе надо цикл от 1 до 2^n степени, где n - количество элементов, удовлетворяющих условию. Условие "как можно меньше записей" и "первое попавшиеся" предполагает как можно быстрейший выход из цикла. Теоретически возможен вариант кода тебе прийдёться перебрать весь массив, а для 30 элементов это 1.073.741.824, вообщем шахматы Перебирать весь массив это конечно вариант. но уж больно долго. Если нужно условие "как можно меньше записей" - можно попробовать примерно такой алгоритм: ищем сначала одну запись, если такой нет, то ищем подходящую пару, ну и т.д. опять же на ПЛСКЛ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2006, 12:32 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
danilov_voЗЫ: подойдет любая информация, линки.. Заранее спасибо.. вот еще ЛЮБАЯ сцылка ...... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2006, 12:34 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2006, 12:40 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
Всем приводившим ссылки сорри - сходить не мог, поэтому решения приводить не стану, но, прикола ради: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2006, 12:48 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2006, 13:05 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
RRA Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2006, 17:54 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2018, 21:32 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
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? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2018, 21:36 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2018, 21:42 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2018, 21:51 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2018, 07:23 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
Zahar H.Is that what you needed?Янки, как у тебя с логикой и ощущением своевременности? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2018, 07:28 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
__vvp_, Нужно найти сочетания строк, может стоит сначала объединить, посчитать суммы и после фильтровать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2018, 11:30 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
XMLer__vvp_, Нужно найти сочетания строк, может стоит сначала объединить, посчитать суммы и после фильтровать?сколько это будет комбинаций для 500 исходных строк? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2018, 12:04 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
andreymx, много. пугает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2018, 13:24 |
|
||
|
Возможно ли такое с помощью SQL?
|
|||
|---|---|---|---|
|
#18+
andreymxXMLer__vvp_, Нужно найти сочетания строк, может стоит сначала объединить, посчитать суммы и после фильтровать?сколько это будет комбинаций для 500 исходных строк? Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2018, 13:42 |
|
||
|
|

start [/forum/topic.php?all=1&fid=52&tid=1884117]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
83ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 365ms |

| 0 / 0 |
