Мне нужно вычислить столбец, у которого столбец значений вычтен из столбца Всего, но может пропускать строки до тех пор, пока он не сможет найти меньшее значение. Последовательность относится к датам, поэтому порядок должен быть сохранен. Значение (Потребность) не может быть больше, чем сумма, так как они были удалены ранее.
Это для SQL Server 2016. Мой первоначальный мыслительный процесс состоял в использовании оконных функций и промежуточного итога, но я не могу понять, как пропустить 400 и перейти к 2 строкам ниже. Я включил свои попытки в оператор CASE как TransferQty, а промежуточный итог - как ReferenceCol.
Код для воспроизведения:
DECLARE @i TABLE
(
sequence INT IDENTITY(1,1)
,Total INT
,Need INT
)
INSERT INTO @i
VALUES (500,100)
,(500,200)
,(500,50)
,(500,400)
,(500,50)
,(500,50)
SELECT
sequence
,Total
,Need
,CASE
WHEN Total - SUM(Need) OVER (ORDER BY sequence) > 0
THEN Need
ELSE 0
END AS TransferQty
,Total - SUM(Need) OVER (ORDER BY sequence) as ReferenceCol
FROM @i
Текущие результаты
+----------+-------+------+-------------+--------------+
| Sequence | Total | Need | TransferQty | ReferenceCol |
+----------+-------+------+-------------+--------------+
| 1 | 500 | 100 | 100 | 400 |
| 2 | 500 | 200 | 200 | 200 |
| 3 | 500 | 50 | 50 | 150 |
| 4 | 500 | 400 | 0 | -250 |
| 5 | 500 | 50 | 0 | -300 |
| 6 | 500 | 50 | 0 | -350 |
+----------+-------+------+-------------+--------------+
Желаемые результаты
+----------+-------+------+-------------+--------------+
| Sequence | Total | Need | TransferQty | ReferenceCol |
+----------+-------+------+-------------+--------------+
| 1 | 500 | 100 | 100 | 400 |
| 2 | 500 | 200 | 200 | 200 |
| 3 | 500 | 50 | 50 | 150 |
| 4 | 500 | 400 | 0 | 150 | --skip calc
| 5 | 500 | 50 | 50 | 100 |
| 6 | 500 | 50 | 50 | 50 |
+----------+-------+------+-------------+--------------+