MySQL SUM и MIN после каждой операции - PullRequest
0 голосов
/ 13 февраля 2019

Рассмотрим следующую структуру таблицы:

|----------|-----------|----|
| Quantity | BaseValue | Id |
|----------|-----------|----|
|  -0.3    | 1         | 1  |
|  -0.8    | 1         | 2  |
|   0.5    | 1         | 3  |
|  -0.2    | 1         | 4  |
|----------|-----------|----|

Допустим, это таблица с именем Transactions.Есть ли способ сделать запрос на выборку для этой таблицы, который будет суммировать значения в столбце Quantity, основываясь на следующем наборе правил:

  • , каждая строка будет суммироваться, чтоимеет Id меньше x
  • сначала, добавьте BaseValue к переменной рода, давайте назовем ее y
  • затем для каждой строки добавьте Quantity к y , и если результат будет меньше 0, y будет 0

Результат, который я хотел бы видеть, выглядит примерно так:

, если x равно 1, y должно быть 1
если x равно 2, y должно быть 0,7
если x равно 3, y должнобыть 0
, если x равно 4, y должно быть 0,5

после выбораоперация Я хотел бы увидеть следующую таблицу, например:

|----------|-----------|----|-----|
| Quantity | BaseValue | Id | Y   |
|----------|-----------|----|-----|
|  -0.3    | 1         | 1  | 1   |
|  -0.8    | 1         | 2  | 0.7 |
|   0.5    | 1         | 3  | 0   |
|  -0.2    | 1         | 4  | 0.5 |
|----------|-----------|----|-----|

Используемая версия MySQL: 10.2.16-MariaDB

Пример:

Допустим, x равно 4, программа должна работать следующим образом:

  1. Y = BaseValue + 0
  2. Получить строку с Id=1,Суммируя вместе Y и Quantity от строки, результат равен 0,7, потому что это больше 0, Y теперь составляет 0,7
  3. Получить строку с Id=2, сумма вместе Y и Quantity от строки, результат равен -0,1, потому что это меньше 0, Y теперь равно 0
  4. Получить строкус Id=3, суммой вместе Y и Quantity от строки, результат равен 0,5, это больше 0, поэтому он остается
  5. Больше не нужно принимать строки как 4 < x не соответствует действительности, поэтому Y равно 0,5

1 Ответ

0 голосов
/ 13 февраля 2019

Вот рекурсивное решение на основе CTE:

WITH RECURSIVE rcte AS (
    SELECT base.*, (SELECT 1.0 /* AS BaseValue FROM other_table */) AS y
    FROM t AS base
    WHERE Id = 1
    UNION ALL
    SELECT curr.*, GREATEST(prev.Quantity + prev.y, 0)
    FROM t    AS curr
    JOIN rcte AS prev ON curr.Id = prev.Id + 1
)
SELECT *
FROM rcte

Вам не совсем ясно, ссылаются ли столбцы «Количество» и «Базовое значение» на текущую итерацию или на предыдущую, но rcte довольно понятен и легко модифицируется.

Демонстрация на дб <> скрипка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...