表 Item 有一个字段 NUM_UNITS。
id num_units
-- ---------
1 2
2 4
3 1
4 7
对于上述行集,sum(num_units) = (2 + 4 + 1 + 7) = 14。
我想编写允许我将 14 更改为 14 - N(即减少)的 SQL 代码,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 行。
这是我到目前为止提出的:我做出了一个函数,可以在选择最大的行和最小行的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 做到这一点,部分是作为一种学习经验。