Элемент таблицы имеет поле NUM_UNITS.
id num_units
-- ---------
1 2
2 4
3 1
4 7
Для указанного набора строк сумма (num_units) = (2 + 4 + 1 + 7) = 14.
Я хотел бы написать код SQL, который позволяет мне изменить 14 на 14 - N (т.е. уменьшить), где N - любое число.
N = 3: row1: num_units = 0, row3: num_units = 0.
N = 4: row2: num_units = 0
N = 5: row2: num_units = 0, row3: num_units = 0
N = 6: row2: num_units = 0, row1: num_units = 0, row3: num_units = 0
N = 7: row2: num_units = 0, row1: num_units = 0, row3: num_units = 0, row4: num_units = 6
Цель состоит в том, чтобы произвести обновление таким образом, чтобы SUM (NUM_UNITS) уменьшилось на N строк.
Вот что я придумал: я сделал функцию, которая проверяет расстояние до желаемого результата при выборе N1 из самых больших строк и N2 из самых маленьких строк.
ALTER FUNCTION F
(
@GOAL INT,
@P1 INT,
@P2 INT
)
RETURNS INT
AS
BEGIN
DECLARE @X INT = (
SELECT SUM(NUM_UNITS)
FROM (
SELECT TOP(@P1) ID, NUM_UNITS
FROM ITEM
ORDER BY NUM_UNITS DESC
UNION
SELECT TOP(@P2) ID, NUM_UNITS
FROM ITEM
ORDER BY NUM_UNITS ASC
) J
)
RETURN @GOAL - @X
END
GO
Теперь уловка состоит в том, чтобы вызывать это последовательно, а также находить следующую наименьшую строку для удаления остатка.
Все это говорит о том, что я заинтересован в решении проблемы, а не в том, чтобы делать это, в частности. Логика напоминает мне о написании программы для внесения изменений. То есть если что-то стоит X, а кассир получает Y, как он / она выбирает купюры и монеты для оптимального возврата?
Любые мысли приветствуются. Предложения по осуществимости и / или направления, чтобы пойти в приветствуются. Я мог бы сделать это на другом языке программирования, но я пытаюсь понять, смогу ли я сделать это на SQL, отчасти как опыт обучения.