Нарастающий итог с условиями

Итак, у меня есть таблица с 2 столбцами - Товар и количество. Колонка [элемент] уникальна, [количество] может иметь такое же значение. Задача: Из первой таблицы составить еще одну таблицу, содержащую дополнительный столбец - cumulative_total. Этот столбец добавляет максимальные значения столбца [количество], но когда cumulative_total достигает 160, вы должны last_value[cumulative_total] = 160, а last_value [количество] = 160 - last_value[количество]. Когда это условие выполнено, задача завершена.

Стол

Элемент количество 241/20 126 241/3 94 42/30 84 236/30 80 167/30 72 236/20 68 23/30 64 44/30 62 46/30 60 237/30 54 238/30 52 59/20 52 390/40 50 232/25 49 54/25 48 95/30 48 139/30 10 167/20 10 254/30 10 97/30 10 241/40 8 342/40 8 35/20 8 36/20 8 68/30 8 270/30 6 251/30 6 25/30 6 45/30 6 33/20 6 39/30 4 38/20 4

Ожидаемый результат:

Элемент количество нарастающий итог 241/20 126 126 241/3 34 160

При необходимости скачайте ссылку .csv файл (https://anonfiles.com/1855h9Rby5/task_csv)

Истинный результат должен выглядеть так я пытаюсь сделать условие для cumulative_total.


Set @total:= 0;
Select item,
       sum(quantity) over (ORDER BY quantity DESC) as quantity,
       if (@total:= @total + `quantity` > 160,
           @total:=160,
           @total:= @total + `quantity`
           ) as cumulative_total
FROM task

Звучит так, как будто все, что вы хотите, это (sum(quantity) over (order by quantity desc)-1) % 160 + 1? предоставьте данные в текстовой форме с ожидаемыми результатами для ваших данных.

ysth 11.01.2023 01:44

Отредактированное сообщение: добавить ожидаемую таблицу

so ez 11.01.2023 02:30

MySQL и Oracle - очень разные СУБД по (слишком) многим аспектам. Какой из них вы используете?

lemon 11.01.2023 02:31

MySQL, мой плохой, в тегах удален oracle

so ez 11.01.2023 02:32

Ваш вывод сделан только двумя строками или это просто пример?

lemon 11.01.2023 02:38

Это просто пример, он может содержать больше

so ez 11.01.2023 02:39

Рассмотрите возможность сокращения выборочных данных до 7–8 строк, но с полным ожидаемым выходом. Трудно понять, что происходит с записями, которые следуют за закрытой (cumulative_total = 160).

lemon 11.01.2023 02:45

Когда мы достигаем [cumulative_total] = 160, то мы должны Last_value [количество], чтобы попасть в финальную таблицу, 160 - last_value [cumulative_total]. В примере - мы получаем больше 160 [cumulative_total], поэтому мы делаем его 160, и last_value[quantity](94) -> make 160 - last_value[cumulative_total](126) = 34

so ez 11.01.2023 02:51

Не знаю, что вы подразумеваете под last_value в своем комментарии или в вопросе. покажите в виде текста набор данных и ожидаемые результаты для всего набора данных. это очень поможет.

ysth 11.01.2023 07:16

О, вы говорите, что строки вывода останавливаются, как только вы достигаете 160, и количество (а не cumulative_total) последней строки может быть уменьшено?

ysth 11.01.2023 07:19
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Доступ AWS Java Lambda к экземпляру AWS RDS MySQL с помощью CDK
Доступ AWS Java Lambda к экземпляру AWS RDS MySQL с помощью CDK
В этой статье мы рассмотрим, как включить доступ Java Lambda к экземпляру AWS RDS MySQL.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
1
10
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если я правильно понимаю, вам просто нужно скорректировать каждое количество на сумму, на которую совокупный итог превысил 160, если таковые имеются. И удалите строки после того, как они достигли 160 во внешнем запросе, ища количества, которые стали отрицательными.

select *
from (
  select
    item,
    quantity - greatest(0, sum(quantity) over (ORDER BY quantity DESC) - 160) as quantity,
    least(sum(quantity) over (ORDER BY quantity DESC),160) as cumulative_total
  from task
) cumulative
where quantity > 0

Рабочий пример

Хорошо, последний вопрос, пожалуйста, если мне нужно сделать тот же запрос, но количество из таблицы должно быть от 0 до 9. Как я могу ограничить это

so ez 11.01.2023 12:52

Дополнение к предыдущему комментарию, нарастающим итогом, для цифр 0 - 9, должно быть не 160, а 40

so ez 11.01.2023 13:07

Другие вопросы по теме