我有一个包含几个表的数据库,这些表跟踪电话/短信/数据和配额,并且我正在尝试计算是否可以在不使用游标的情况下将配额分配给配额,但是我想不通一种方法构造SQL来做到这一点。我的尝试中没有任何有用的SQL,因为我似乎无法掌握如何使用它的方法!问题在于,对我而言,这似乎是一个固有的迭代过程,如果有明智的方法将其转换为基于集合的方法,我将无法解决。我已经考虑过使用开窗函数,但是当我们跟踪2个表中的累计总数并且总数是相互依赖的时,我看不到该怎么做。我正在尽量减少运行此过程的时间以及对其他查询的影响,因为
这是一个简化的结构…
记录所有通话
每份合约有哪些不同的备抵金
如何使用津贴-这是一个联结表,列出了允许的组合
为了简化起见,我故意没有记录所有细节。我希望一切都显而易见,但如果没有,请告诉我。
如果我反复处理此问题,我的伪代码将类似于:-
For each Call ordered by DateTime
Declare a as Allowance
Do
Set a = First Allowance Where Allowance.ContractID=Call.ContractID And Allowance.QuantityUsed<Allowance.Quantity Order by Priority Descending
If a != NULL
Declare n as Integer
Set n = a.Quantity-a.QuantityUsed
If Call.Quantity-Call.QuantityFromAllowances<n
Set n = Call.Quantity-Call.QuantityFromAllowances
End if
Set Call.QuantityFromAllowances = Call.QuantityFromAllowances + n
If Call.FirstAllowanceUsedID == NULL Then
Set Call.FirstAllowanceUsedID = a.ID
End if
Set a.QuantityUsed = a.QuantityUsed + n
End if
Loop while a != NULL AND Call.QuantityFromAllowances<Call.Quantity
Next Call
随时告诉我我正在错误地解决问题,或者这实际上是游标的一个很好的候选人。我只是在寻找最佳解决方案。
举个例子: -
称呼
ID合同ID ChargeGroupID DateTime数量QuantityFromAllowances FirstAllowanceUsedID
1 1 1 2016-11-01 100 0空
2 1 2 2016-11-02 500 0空
3 1 1 2016-11-03 500 0空
4 1 3 2016-11-04 100 0空
5 1 1 2016-11-05 100 0空
6 2 1 2016-11-01 100 0空
津贴
ID合同ID优先数量使用的数量
1 1 1 500 0
2 1 0 500 0
3 2 1 500 0
4 2 0 500 0
津贴组
ID配额ID ChargeGroupID
1 1 1
2 1 2
3 2 1
4 2 2
5 3 1
在我的示例中,我将其计算如下:-
之后,表格应如下所示(仅更改为Call.QuantityFromAllowances,Call.FirstAllowanceUsedID,Allowance.QuantityUsed
…
称呼
ID合同ID ChargeGroupID DateTime数量QuantityFromAllowances FirstAllowanceUsedID
1 1 1 2016-11-01 100 100 1
2 1 2 2016-11-02 500 500 1
3 1 1 2016-11-03 500 400 2
4 1 3 2016-11-04 100 0空
5 1 1 2016-11-05 100 0空
6 2 1 2016-11-01 100 100 3
津贴
ID合同ID优先数量使用的数量
1 1 1 500 500
2 1 0 500 500
3 2 1 500 100
4 2 0 500 0
津贴组
ID配额ID ChargeGroupID
1 1 1
2 1 2
3 2 1
4 2 2
5 3 1
您要同时更新呼叫表和限额表,并且每次更新都取决于上一个。
仅使用一条sql语句是不可能的,因此您需要循环。
您不需要游标,可以在过程中使用顺序设置操作来解决它。
首先进行一些声明并准备一些数据:
declare @todo as table (callID int primary key, qt int, done bit, unique (done, qt, callid))
declare @id1 int, @id2 int, @q1 int, @q2 int
-- prepare job list
insert into @todo
select id, Quantity-QuantityFromAllowances, 0
from [call]
where Quantity>QuantityFromAllowances
然后主循环波谷调用:
set @id1=0
set @q1= null
while not(@id1 is null) begin
set @id1=null
select top 1 @id1 = callID, @q1=qt from @todo where done=0 and qt>0 order by callID
if not(@id1 is null) begin
set @id2 = null
select top 1 @id2 = a.id, @q2 = a.Quantity - a.QuantityUsed
from [call] c
inner join AllowanceChargeGroup g on g.ChargeGroupID = c.ChargeGroupID
inner join allowance a on (a.ID = g.AllowanceID) and (a.Quantity>a.QuantityUsed)
where c.ID=@id1
order by c.ID,[Priority] desc, (a.Quantity-a.QuantityUsed) desc
if not(@id2 is null) begin
if @q2 < @q1 set @q1 = @q2
update a set QuantityUsed = QuantityUsed + @q1
from allowance a
where a.ID=@id2
update c set QuantityFromAllowances = QuantityFromAllowances + @q1, FirstAllowanceUsedID = isnull(FirstAllowanceUsedID, @id2)
from [call] c
where c.ID=@id1
update t set qt = qt-@q1, done = IIF(qt-@q1=0,1,0)
from @todo t
where t.callID=@id1
end else begin
-- unable to complete
update t set done = 1
from @todo t
where t.callID=@id1
end
end
end
最后是输出:
select * from [call]
select * from allowance
与要求相同
在我的应用程序中,我试图创建组件 null 我已经创建了组件,并从应用程序类启动。 ContextModule类如下所示 上下文组件将是 错误:
问题内容: 我有一个在后端使用postgres数据库的项目,并且我正在创建一个Dockerfile,该文件可以自动设置数据库的本地开发实例。该数据库包含大量功能,并且这些功能在历史上一直存储在上下文相关的sql文件中,例如,users.sql,companys.sql。这样做很好,因为每当进行更改时,我都可以简单地执行所有视图和删除/重新创建所有函数的相关sql文件。 但是,当尝试在一个新的pos
问题内容: 我已经搜索了很多,但是我发现的主要是python中的递归编程示例。因此,问题来了: 我该如何实现? 问题答案: 一切在Python中都是动态的-甚至是类声明。在初始声明之后,没有什么可以阻止您修改类的内容的: 注意:如果您不太熟悉Python,则该关键字仅允许您说“这里什么都没有”-除非A类的空值与本例中的一样空,否则它并不重要!
我想在Python3.4中定义2个类并使用类型提示,但它们之间有一定的依赖性。 这是我的密码 和返回的错误: E0601:在赋值前使用变量'父' 如何提示类的初始化函数的参数的类型? 谢谢
我知道循环依赖通常是不被鼓励的——然而,在C#和TypeScript中,我有时发现它们很有用。这可能是因为我缺乏python方面的经验,也可能是因为我的思维方式不对,或者是因为我没有找到谷歌应该使用的词语。我将如何解决以下问题? 我试图创建一个处理请求的类,每个处理事件都伴随着一个上下文。所以,我想创建handler类和context类,但它们是依赖的,linter在第2行给了我问题,说Handl
问题内容: 我们的系统中有许多在Linux上运行的小项目(Slackware 7-11,正在缓慢迁移到RHEL 6.0)。大约50-100个应用程序和15-20个库。我们几乎所有的应用程序都使用一个或多个我们的库。我们的源代码树如下所示: 现在,我已经完成了一些创建CMakeLists.txt文件的工作,并构建了大多数库和某些应用程序。我对使用cmake进行构建相当满意。我使用v2.6做到了这一点