Запрос Mysql для поиска значения в диапазоне совокупной суммы

#mysql #logic

Вопрос:

У меня есть стол, который выглядит так:

ID считать
1 100
2 50
3 10
4 10

Я хочу запустить запрос select*, используя новый столбец cumulative_sum , чтобы этот новый столбец не создавался в таблице, а каждый раз запрашивался (вычислялся) и использовался для выбора строк, лежащих между пределом и смещением, еще 1 строка после него.

Предположим, я предоставляю смещение =130 и ограничение= 25 (т. Е. Диапазон от 130 до 155), тогда он должен возвращать строку 2, строку 3 и строку 4 (т. Е. последняя строка 1)

ID считать совокупный_сумм
1 100 100
2 50 150
3 10 160
4 10 170

Как написать запрос Mysql для вышеуказанного условия?

Я пытаюсь добиться этого уже довольно давно, пожалуйста, помогите мне понять, как это сделать?

Столбец суммарной суммы-это просто сумма = последних строк суммарная сумма количество текущей строки

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

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

2. @TimBiegeleisen , Таблица под выводом должна была обобщить расчет суммарной суммы и фактический результат, который я написал в текстовой форме(«Предположим, я предоставлю смещение = 130 и ограничение = 25 (т. Е. Диапазон от 130 до 155), тогда он должен вернуть строку 2, строку 3 и строку 4 (т. Е. последняя строка 1)») над таблицей. Вероятно, из-за этого возникла путаница, поэтому, чтобы прояснить путаницу, внесли правки.

Ответ №1:

В MySQL 8 мы можем просто использовать SUM() в качестве аналитической функции:

 SELECT id, count, SUM(count) OVER (ORDER BY id) AS cumulative_sum FROM yourTable ORDER BY id;  

В более ранних версиях MySQL мы можем использовать коррелированный подзапрос для поиска скользящей суммы:

 SELECT id, count,  (SELECT SUM(t2.count) FROM yourTable t2  WHERE t2.id lt;= t1.id) AS cumulative_sum FROM yourTable t1 ORDER BY id;  

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

1. это решение не дает правильного вывода, пожалуйста, проверьте пример, который я добавил в вопрос. Я ищу, чтобы получить строки = выберите строки, расположенные между пределом и смещением, еще 1 строка после него. ограничение и смещение будут указаны пользователем.

Ответ №2:

Используйте Window function для достижения этой цели (работает с MySQL 8.0 и выше):

 SELECT id, count, sum(count) OVER (ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as cummulative_sum FROM your_table ORDER BY id  

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

1. это решение не дает правильного вывода, пожалуйста, проверьте пример, который я добавил в вопрос. Я ищу, чтобы получить строки = выберите строки, расположенные между пределом и смещением, еще 1 строка после него. ограничение и смещение будут указаны пользователем.