#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 строка после него. ограничение и смещение будут указаны пользователем.