Скажем, у меня есть запрос, который возвращает следующий результат:
| val | type | i |
----------------------
| 59 | 1 | 1 |
| 40 | 2 | 2 |
| 12 | 1 | 3 |
| 3 | 2 | 4 |
| 24 | 1 | 5 |
| 30 | 1 | 6 |
| 98 | 2 | 7 |
| 45 | 2 | 8 |
| 46 | 1 | 9 |
val = an arbitrary number
type = 1 or 2
i = auto increment column, just for reference
Я хочу выполнить следующее вычитание:
A - B
A: Value of row of type '2'
B: Value of row above A of type '1' if it exists, but without crossing a row of type '2'
Я действительно надеюсь, что это имело смысл ..
Некоторые примеры:
Row i=2 is of type 2. So the first row above it of type 1 is i=1.
So the subtraction will be: 40 - 59 = -19
Row i=7 is of type 2. So the first row above it of type 1 is i=6
So the subtraction will be: 98 - 30 = 68
Row i=8 is of type 2. But if we go above we cross a value of type 2.
So the subtraction should return 0, or be ignored, whichever is simplest.
В конце результат должен вернуть столбец значений, где type = 1 и вычтенное значение.
Например:
| val | diff |
--------------
| 59 | -19 |
| 12 | -9 |
| 24 | 0 | ***
| 30 | 68 |
| 46 | 0 | ***
*** Return diff=0 if the subtraction was never made for this row.
У меня есть запрос для получения моей начальной таблицы.Я знаю, как сделать вычитание (в реальном случае val - это дата, но я держу это простым для этого примера).
Единственное, что я не знаю, как это сделать, - это выполнять логику, основанную на разных строках в MySQL.Например, как я могу найти ближайшую строку на основе некоторого условия, а затем сослаться на эту строку, чтобы выполнить с ней какую-то операцию?Возможно, есть способ сослаться на текущее «i» и сделать вычитание на (строка в i) минус (строка в i-1) или что-то подобное.
Я уже потратил много часов на это иЯ просто собираюсь сдаться и сделать это в php вместо этого и принять удар производительности.В качестве последнего средства я спрашиваю здесь, есть ли способ сделать все это в MySQL напрямую?
Мне не нужно полное решение, так как это довольно сложное требование, но я приму любой совет илиуказатели вы можете дать мне.Я не лучший в MySQL, поэтому, может быть, я упускаю что-то простое.
Спасибо.