Sql 按一定顺序从几行中删除数量
我想写下一个更新/删除查询,该查询允许我请求删除x个数量,并且该查询将在有值时删除/更新行 例如,下面的表格是我的一个简化版本,只是为了得到我想做的一些其他验证的想法,但这只是我的主要问题Sql 按一定顺序从几行中删除数量,sql,sql-server,Sql,Sql Server,我想写下一个更新/删除查询,该查询允许我请求删除x个数量,并且该查询将在有值时删除/更新行 例如,下面的表格是我的一个简化版本,只是为了得到我想做的一些其他验证的想法,但这只是我的主要问题 ╔═══════╦═════╗ ║ Rowid ║ qtd ║ ╠═══════╬═════╣ ║ 1 ║ 2 ║ ╠═══════╬═════╣ ║ 2 ║ 1 ║ ╠═══════╬═════╣ ║ 3 ║ 3 ║ ╠═══════╬═════╣ ║ 4 ║ 4
╔═══════╦═════╗
║ Rowid ║ qtd ║
╠═══════╬═════╣
║ 1 ║ 2 ║
╠═══════╬═════╣
║ 2 ║ 1 ║
╠═══════╬═════╣
║ 3 ║ 3 ║
╠═══════╬═════╣
║ 4 ║ 4 ║
╠═══════╬═════╣
║ 5 ║ 3 ║
╠═══════╬═════╣
║ 6 ║ 5 ║
╚═══════╩═════╝
假设我在这里写了一个删除9个数量的查询
最终结果应该是这样的
╔═══════╦═════╗
║ Rowid ║ qtd ║
╠═══════╬═════╣
║ 1 ║ 2 ║
╠═══════╬═════╣
║ 2 ║ 1 ║
╠═══════╬═════╣
║ 3 ║ 3 ║
╠═══════╬═════╣
║ 4 ║ 3* ║
╠═══════╬═════╣
╠═══════╬═════╣
╚═══════╩═════╝
这里发生了什么:
从第6行中删除了5个数量,因为该行达到0,因此已将其删除。
第5行中删除了3个数量,因为该行达到0,因此已将其删除。
第4行中删除了1个数量,新值已从4更新为3。
我想看看是否可以在sql中直接使用一些可行的选项。为了避免使用其他选项进行一些丑陋的硬编码
通过使用干净的sql选项,我可以将其保存为了解更多信息。您可以使用累积总和和一些逻辑:
select rowid,
(case when running_qtd < 5 then 0
when running_qtd - qtd < 5 then running_qtd - qtd
else qtd
end) as amount_left
from (select t.*, sum(qtd) over (order by rowid desc) as running_qtd
from t
) t;
这包括所有行,并将剩余的qtd放入列中 您可以使用累积总和和一些逻辑:
select rowid,
(case when running_qtd < 5 then 0
when running_qtd - qtd < 5 then running_qtd - qtd
else qtd
end) as amount_left
from (select t.*, sum(qtd) over (order by rowid desc) as running_qtd
from t
) t;
这包括所有行,并将剩余的qtd放入列中 这里没有删除或更新。我仍然不知道如何让sql选择要使用的witch选项。@AlexandreCalvario。不要删除行。只需将qtd设置为0。此处没有删除或更新。我仍然不知道如何让sql选择要使用的witch选项。@AlexandreCalvario。不要删除行。只需将qtd设置为0。