У меня есть некоторые данные, которые выглядят так:
+---+--------+-------------+---------------+--------------+
| | A | B | C | D |
+---+--------+-------------+---------------+--------------+
| 1 | row_id | disposal_id | excess_weight | total_weight |
| 2 | 1 | 1 | 0 | 30 |
| 3 | 2 | 1 | 10 | 30 |
| 4 | 3 | 1 | 0 | 30 |
| 5 | 4 | 2 | 5 | 50 |
| 6 | 5 | 2 | 0 | 50 |
| 7 | 6 | 2 | 15 | 50 |
| 8 | 7 | 2 | 5 | 50 |
| 9 | 8 | 2 | 5 | 50 |
+---+--------+-------------+---------------+--------------+
И я преобразую это так:
+---+--------+-------------+---------------+--------------+
| | A | B | C | D |
+---+--------+-------------+---------------+--------------+
| 1 | row_id | disposal_id | excess_weight | total_weight |
| 2 | 1 | 1 | 0 | 30 |
| 3 | 2 | 1 | 10 | 30 |
| 4 | 3 | 1 | 0 | 20 |
| 5 | 4 | 2 | 5 | 50 |
| 6 | 5 | 2 | 0 | 45 |
| 7 | 6 | 2 | 15 | 45 |
| 8 | 7 | 2 | 5 | 30 |
| 9 | 8 | 2 | 5 | 25 |
+---+--------+-------------+---------------+--------------+
По сути, мне нужно обновить столбец total_weight путем вычитания суммы избыточных весов из предыдущих строк в таблице, которые принадлежат к одному и тому же избавлению_иде.
Я сейчас использую курсор, потому что он быстрее, чем другие решения, которые я пробовал (cte, треугольное соединение, перекрестное применение). Мое решение с курсором сохраняет промежуточный итог, который сбрасывается в ноль для каждого нового параметра disid_id, увеличивает его на избыточный вес, выполняет обновления при необходимости и запускает примерно за 40 секунд. Другие решения, которые я пробовал, заняли где-то 3-5 минут, и мне интересно, есть ли относительно эффективный способ сделать это с помощью операций на основе множеств?