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

#sql #sorting #sum

#sql #сортировка #сумма

Вопрос:

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

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%.

Комментарии:

1. По сути, это вычисление текущих итогов. Для какой СУБД это предназначено?

2. Вам нужен процент от общего числа или вы просто выбираете целевое число? Если бы у вас было 100 разных значений, и вы хотели, чтобы сумма всех записей равнялась определенному числу, но не превышала его (например, 453), сработало бы это?

Ответ №1:

 --save the whole sum into a variable
summa = select sum(val) from sometable;

select * 
  from sometable o 
 where (
        select sum(val) 
          from sometable i 
         where i.val <= o.val
       ) >= 0.6*summa;
  

Комментарии:

1. Ваше использование зарезервированных слов table , outer и inner делает этот запрос очень трудным для чтения.

2. Я думаю, что так и должно быть i.val <= o.val . Онлайн-демонстрация data.stackexchange.com/stackoverflow/q/99506

3. Да, вы правы. И онлайн-демонстрация: я просто говорю вау! Спасибо

Ответ №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)
  

Комментарии:

1. для чего нужен порядок по? Вы можете избежать временной таблицы, используя CTE, например.

2. порядок по необходим, поскольку операционной системе требуется x наибольших значений

3. Вы правы. Я должен был упомянуть: Я не эксперт по SQL :-). Удален порядок с помощью

4. оба ответа верны, но у него была онлайн-демонстрация, так что вам остается только показать большой палец 🙂 Спасибо!