判别式和 - Sql server

问题描述

我有 2 张桌子:

  1. 包含我可以使用的限额和优先使用的银行(我应该先使用哪个限额)
  2. 包含我的动作和文档的价值

我需要开具发票,为此我需要通过将用于银行收据的银行。我每批只能寄 20 张发票。我的问题是我的客户想最大化每家银行的限额,所以文件应该根据过去的文件和限额收到正确的银行。例如:

我有 5 个文档

111 - value: 5
222 - value: 4
333 - value: 7
444 - value: 1
555 - value: 2 

有 3 个银行

a - limit:15 order:1
b - limit:10 order:2
c - limit:20 order:3

程序应该为moviments设置以下内容

111 - Bank A
222 - Bank A
333 - Bank B
444 - Bank A
555 - Bank A

其中 3 是 B,因为考虑到使用银行 A(9) 的过去文件总和小于使用 B(0) 的文件总和,他会打破 A 的限制

我怎样才能在一个选择中做到这一点?我不能使用循环,因为它真的很慢,而且处理的文档量很大,让我有很多超时

declare @table_bank table(
                                        pk int,bank_name varchar(50),total_limit money,priority_use int
)

declare @table_doc table(
                    pk int,valor money
)
insert into @table_doc(pk,valor) values(1,5)
insert into @table_doc(pk,valor) values(2,4)
insert into @table_doc(pk,valor) values(3,7)
insert into @table_doc(pk,valor) values(4,1)
insert into @table_doc(pk,valor) values(5,2)

insert into @table_bank(pk,bank_name,total_limit,priority_use) values(1,'aaa',15,1)
insert into @table_bank(pk,'bbb',10,2)
insert into @table_bank(pk,'ccc',20,3)

解决方法

在这种情况下,循环是一种非常合理的方法

select t.*,ceiling(row_number() over (order by value desc) * 1.0 / <n>) as bank_number
from t;

这在所有情况下都不是最好的,但它速度很快并且做得相当好。