我有一个包含数百万个交易记录(Obj1)的表,看起来像这样
TransactionNum Country ZipCode State TransactionAmount
1 USA 94002 CA 1000
2 USA 00023 FL 1000
我有另一个包含Salesreps记录(Obj2)的表,再次成千上万。
SalesrepId PersonNumber Name
Srp001 123 Rohan
Srp002 124 Shetty
我有一些规则集表,其中基本规则定义如下
合格标准适用于交易,这意味着如果交易属性与规则中的条件匹配,则会将信用分配给规则的信用接收方部分中定义的销售额。
现在,我需要一个算法来填充结果表,如下所示
ResultId TransactionNumber SalesrepId Credit
1 1 Srp001 700
2 2 Srp002 300
执行此操作的有效算法是什么?
答案 0 :(得分:1)
所以你真正的问题是如何快速地将交易与潜在规则相匹配。您可以使用反向索引来执行此操作,该索引说明哪些规则与属性的特定值匹配。例如,假设您有以下三条规则:
Rule 1: if Country = "USA" and State = "FL"
S1 gets 100%
Rule 2: if Country = "USA" and (State = "CO" or ZIP = 78640)
S2 gets 60%
S3 gets 40%
Rule 3: if Country = "UK"
S3 gets 70%
S2 gets 30%
现在,您处理规则并创建如下输出:
Country,USA,Rule1
State,FL,Rule1
Country,USA,Rule2
State,CO,Rule2
ZIP,78640,Rule2
Country,UK,Rule3
然后处理该输出(或者您可以在处理规则时执行此操作)并构建三个表。一个将Country值映射到规则,一个将State值映射到规则,一个将ZIP值映射到规则。你得到的结果如下:
Countries:
USA, {Rule1, Rule2}
UK, {Rule3}
States:
FL, {Rule1}
CO, {Rule2}
"*", {Rule3}
ZIP:
78640, {Rule2}
"*", {Rule1, Rule3}
“*”值是“不关心”,它将匹配所有未明确提及该字段的规则。是否需要这取决于您如何构建规则。
只要规则发生变化,就会构建上述索引。有4000条规则,它根本不需要任何时间,列表大小不应该很大。
现在,给定一个国家/地区值为“USA”的交易,您可以查看“国家/地区”表格以查找提及该国家/地区的所有规则。调用该列表Country_Rules
。为州和邮政编码做同样的事情。
然后,您可以执行列表交集。也就是说,构建另一个名为Country_And_State_Rules
的列表,该列表仅包含Country_Rules
和State_Rules
列表中存在的那些规则。这通常是一小组可能的规则。然后,您可以逐个浏览它们,根据需要测试国家/地区,州和邮政编码。
您正在构建的内容本质上是规则的搜索引擎。它应该允许你很快将候选人从4,000缩小到屈指可数。
您需要解决一些问题。使用条件逻辑(“OR”)会使事情变得复杂,但这并不棘手。此外,您必须确定如何处理歧义(如果两个规则匹配会怎么样?)。或者,如果没有规则与特定国家/地区匹配,则必须备份并检查仅与国家/地区匹配的规则...或仅匹配状态。这就是“不关心”的地方。
如果您的规则足够明确,那么在绝大多数情况下,您应该能够非常快速地选择相关规则。有些情况会要求您为某些交易搜索许多不同的规则。但这些案件应该非常罕见。如果它们很频繁,那么您需要考虑重新检查您的规则集。
一旦您知道哪条规则适用于特定交易,您就可以轻松查找哪个销售人员获得了多少,因为比例与规则一起存储。