как выбрать значения, которые в сумме составляют до 60% от общего

предположим, что у меня есть таблица такого типа:

A B 3
C D 1
E F 2
G H 4

Сумма последнего столбца равна 10, и мне нужны самые большие значения, которые в сумме составляют не менее 60% от общего значения. Итак, в этом случае он вернется

G H 4
A B 3

Он достигает 70%, но если было выбрано только 1-е значение, оно будет увеличиваться только до 40%. Несмотря на то, что может быть комбинация, которая вернет ровно 60%, мы хотим взять самые большие числа.

Итак, я думаю, что знаю, как сортировать значения от большего к меньшему и как суммировать все значения, но я не знаю, как затем брать только строки, сумма которых составляет 60%.


person n00b programmer    schedule 04.05.2011    source источник
comment
Это в основном подсчет промежуточных сумм. Для какой СУБД это?   -  person Martin Smith    schedule 04.05.2011
comment
Вам нужен процент от общего числа или вы просто собираетесь получить целевое число? Если бы у вас было 100 различных значений, и вы хотели бы, чтобы сумма всех записей была до, но не выше определенного числа (например, 453), это сработало бы?   -  person Christopher Klein    schedule 04.05.2011


Ответы (2)


Я думаю, что это дает вам правильный результат. Однако нужно работать с временной таблицей, не уверен, что этого можно избежать.

DECLARE @total bigint

select @total = SUM(value) from SampleTable

select st.*, 
convert(decimal(10,2), (select SUM(value) from SampleTable st2 where st2.Value >= st.Value))/@total as percentage
into #temptable
from sampletable st

select * from #temptable 
where Value >= (select max(Value) from #temptable where percentage >= 0.6)
person jeroenh    schedule 04.05.2011
comment
для чего заказ? Вы можете избежать использования временной таблицы, например, с помощью CTE. - person onedaywhen; 04.05.2011
comment
порядок необходим, так как OP нуждается в x самых высоких значениях - person jeroenh; 04.05.2011
comment
Ты прав. Я должен был упомянуть: я не эксперт по SQL :-). Удалил заказ по - person jeroenh; 04.05.2011
comment
оба ответа правильные, но у него была онлайн-демонстрация, так что только палец вверх :) Спасибо! - person n00b programmer; 05.05.2011

person    schedule
comment
Использование вами зарезервированных слов table, outer и inner затрудняет чтение этого запроса. - person onedaywhen; 04.05.2011
comment
Я думаю, что это должно быть i.val <= o.val. Онлайн-демонстрация data.stackexchange.com/stackoverflow/q/99506 - person Martin Smith; 04.05.2011
comment
Да, ты прав. И онлайн-демонстрация: я просто говорю вау! Благодарность - person bpgergo; 04.05.2011