Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день.
Прошу помочь с запросом, пытаюсь получить сумму желаемого числа 17404142.26
из таблицы docs c полями id, doc,docsum. В итоге получаю не все суммы числа. нужна одна из подходящих комбинаций.
Т.е. пример желаемая сумма 10, ее можно собрать из значений 1+2+3+4 = 10.
Комбинаций может быть много, но нужна одна которая дает эту сумму. Или не быть вообще, нужно точное совпадение.
Пытаюсь делать таким запросом:
Неактивен
У Вас в запросе есть нестрогое равенство - не вполне понятно, чего нужно.
На более упрощенном примере, если у нас данные в таблице
1
7
5
6
2
, то какой результат Вы хотите получить?
Неактивен
хочу получить 17404142.26
Неактивен
со строгим равенство вообще не получаю результаты, хотя они есть
Неактивен
1
7
5
6
2
Желаемая сумма 8; 1+7 = 8; или 2+6 = 8
Неактивен
мне достаточно 1+7 = 8, все перебирать не нужно. Остановиться на одном варианте если он есть.
Неактивен
Для меня задачка выглядит больше по математике / программированию, чем на SQL-запросы. Ну то есть если объем данных небольшой, то можно просто вытащить куда-то в приложение, и там побегать.
Алгоритмически она решается, к сожалению, только полным перебором. Также не могу не заметить, что задача очень плохо поставлена, если там действительно числа с плавающей запятой. Из-за особенностей представления таких чисел в современных компьютерах, сравнение по равенству может работать не так, как Вы ожидаете:
Неактивен
мне нужен только один результат все комбинации не нужны
Неактивен
для целых чисел это работает, делал по инструкции:
https://stackoverflow.com/questions/386 … tain-value
Неактивен
select id,doc,docsum
from docs t
where docsum+coalesce((select round(sum(docsum),2) from docs where docsum<t.docsum),0) <= 17404142.26
order by docsum
результат не поменялся
Неактивен
http://sqlfiddle.com/#!9/17bcc3/138 - фидлер
Неактивен
можете показать как это рекурсией сделать?
Неактивен
type-2019 написал:
Комбинаций может быть много, но нужна одна которая дает эту сумму. Или не быть вообще, нужно точное совпадение.
Пытаюсь делать таким запросом:
Таким запросом не получится. Он ищет не все строки сумма которых <= 17404142.26
А зачем нужно именно sql запросом решать задачу? Это плохой путь.
type-2019 написал:
можете показать как это рекурсией сделать?
См https://sqlinfo.ru/articles/info/40.html
Для вашего случая будет что-то вроде:
Неактивен
ага, спасибо. Постараюсь разобраться. А для чего Id "0" вводится?
Неактивен
type-2019 написал:
ага, спасибо. Постараюсь разобраться. А для чего Id "0" вводится?
Начальный элемент рекурсии (возможно, можно взять первый эл-т таблицы вместо нуля).
Рекомендую, посмотреть цикл статей от непосредственного разработчика - https://sqlinfo.ru/articles/info/40.html Очень хорошо изложено.
Неактивен
а как получить любой рандомный один результат?
Неактивен
добавьте "limit 1"
если нужно именно рандомный, то - order by rand() limit 1
Неактивен