LINUX.ORG.RU

[sql] Это вообще решаемо?

 


0

0

Есть таблица с целочисленными парами (ключ, значение). Ключи уникальные.

Задана максимально допустимая сумма значений: S. Выбираем из таблицы пару с самым маленьким ключом. Если значение при этом ключе меньше чем S, то добавляем к выборке пару со вторым по величие ключом. Если сумма значений у выбранных пар меньше чем S, то добавляем к выборке пару с третьим по величине ключом. И так далее, до тех пор пока сумма не перестанет быть меньше чем S, или пока не будут выбраны вообще все пары. Требуется узнать ключ K, который будет выбран последним.

Примерно то же самое, но более строгим языком:

найти максимальный ключ K, такой, что
   сумма значений соответствующих всем ключам, таким, что
      ключ меньше чем K,
   меньше чем S

Это возможно сделать SQL-запросом?

★★★★★

Последнее исправление: Manhunt (всего исправлений: 1)

Ответ на: комментарий от akinator

> Такого условия не было.

Так ты ж акинатор, мог бы и догадаться.

anonymous
()
Ответ на: комментарий от akinator

Хм. И правда. В моем случае это решение должно проканать.

Спасибо всем, кто отозвался!

Manhunt ★★★★★
() автор топика

Оформляй процедурой.

SOmni ★★
()
Ответ на: комментарий от Manhunt

Приносить 100500 записей из БД, чтобы обработать парочку - в этом есть что-то... м-м-м... нехорошее.

SOmni ★★
()
Ответ на: комментарий от kelyar

>а если их там сто миллионов?

А какая разница? Обсчитывать можно по мере чтения.

KRoN73 ★★★★★
()

то что вы хотите называется _нарастающий_итог_ (или _нарастающая_сумма_ ) и вариантами полон гугол :)

на скорую руку - примерно так :

/* недо-sqlite */
CREATE TEMPORARY TABLE tab (
  k integer not null,
  s integer,
  primary key(k)
);
-- 
--
select 
  k,(select sum(s)
     from tab as d1
     where d1.k<=d2.k) as itog
from tab as d2
where itog<11
order by itog
desc
limit 1;
MKuznetsov ★★★★★
()
Ответ на: комментарий от baverman

можно оптимизировать при помощи окон, если СУБД поддерживает их

unC0Rr ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.