FIFO使用SQL服务器实现

时间:2015-11-29 00:52:09

标签: sql-server fifo

我正在寻找FIFO的SQL服务器实现。对于大公司的客户,我有2个数据集,其中包含在一个数据集中获得的积分,以及每年在另一个数据集中兑换和过期的积分。

目标是确定在任何特定年份中获得的积分中兑换和过期的积分。因此,显然,兑换和过期的积分必须以先进先出的方式分配给获得的积分。

数据集如下所示:

获得的积分:

ID   year   earn
1    2000   100
1    2001   150
1    2002   75
1    2003   10
1    2004   120

点燃:

ID   Year   Type   points
1    2001   burn    50
1    2001   exp     20
1    2003   burn    120
1    2004   exp     100
1    2006   exp     20

组合这两个数据集,我们应该得到一个这样的数据集:

合并数据集:

ID   Year   Earn   Burn   exp
1    2000   100    80     20
1    2001   150    90     60
1    2002   75     0      60
1    2003   10     0      0
1    2004   120    0      0

简单地说,已烧毁和过期的积分将分配给先进先出的积分。数据集很大,无法在Excel中导出。在SQL服务器上执行上述操作的代码将会有很大的帮助

1 个答案:

答案 0 :(得分:0)

我想出了答案。我当然没有最有效的代码,但我有以下算法来分配使用FIFO逻辑兑换过期的点数

  1. 计算个人将使用的最大分数。这将包括兑换和过期的积分。目标是将这些点分配给不同的收益交易
  2. 计算超过所用最高点的收入交易。在此之下的任何交易都不应该在兑换或过期时分配任何积分。因此,对所有这些交易进行兑换和过期0。现在,我们只需要为剩下的其他交易分配点数
  3. 对于每笔收益交易,从已使用的表中计算出与该交易中获得的点数相交的交易。现在,对于此收益交易,需要分配的总到期点数是到达使用表中的相应交易之前到期的总点数+此交易从使用的表中剩余的任何数量,具体取决于它是已兑换的交易还是已过期交易。同样,兑换的积分也需要指定
  4. 该算法运行良好。我本可以在编码方面做得更好。我花了3个小时在一个拥有1.5亿条记录的数据集上运行