超市一个月内累计断货时间最长的商品

一个简化的超市的库存管理系统内的一些表如下。

首先是商品表Commodity.txt,记录各种产品的信息:

..

下面是进货记录表Stock.txt,超市在每天早上 5 点钟进货,下表记录了每次进货每种商品的进货数量:

..

下面是每月最后的剩余库存表Storage.txt,记录在每个月最后一天所有商品的剩余库存:

..

最后是超市的销售记录详表Sale.txt

..

为考察进货策略是否合适,需要算出 20096 月内累计断货时间最长的商品,超市在早上 8 点钟开门,晚上 9 点结束营业,非营业时间内的断货不计算在内。

首先要创建一个统计剩余库存和断货情况的表,而后将进销表都按日期分组,循环每天,遍历每条进销记录,即时统计断货情况,累计断货时间,最后汇总断货时间,就可以找出断货时间最长的商品了。


A

B

1

=T("Commodity.txt").keys(ID)

=T("Stock.txt").select(month@y(Datetime)==200906)

2

=T("Storage.txt").select(month@y(Date) ==200905)

=T("Sale.txt").select(month@y(Datetime)==200906)

3

=A2.new(datetime(Date):Datetime,Commodity, Stock:Volume)

=B2.new(Datetime,Commodity,-Volume:Volume)

4

=(A3|B1|B3).sort(Commodity,Datetime).derive(cum(Volume;Commodity):Stock)

5

=A4.group(Commodity;~.sum(if(Stock[1]==null && Stock==0, interval@s(time(Datetime),time(21,0,0)), if(Stock[-1]==0, interval@s(time(Datetime[-1]), time(21,0,0))+13*3600*(Datetime-Datetime[-1]-1)))):oos)

6

=A5.maxp@a(oos)

https://try.esproc.com/splx?2V8

A1读出商品信息表,B1读出20096月的进货记录表,A2读出20095月底的库存信息表,B2读出20096月的销售记录表。

下面准备将库存信息、进货信息和销售记录整合在一起来计算,为此,先在A3中整理库存信息,将字段名与其它两个表统一。B3中整理销售记录,其中的Volume均为售出,会使得库存减少,因此改为负值。

A4将整理后的库存表、进货信息表和销售记录表整合,并在排序后添加Stock列,用cum计算每种商品的当前库存:

..

SPL中,可以将同样结构的不同表中的记录合并在一起计算,类似于SQL中的union,但是并不需要生成一个新的表,而是由不同表中的记录共同组成。

A5group函数分组汇总,计算每种商品的总断货时间。每一次的商品变化情况,如果最后一天断货,计算当天断货时间。否则,如果上条记录中stock等于0说明断货后完成了补充,此时可以计算此次断货时间。计算时,先计算断货当天的断货时间,再计算补货前经过了多少个营业日,,每个营业日中8:0021:0013个小时断货。计算完成后列出每种商品的断货时间oos结果如下:

..

A6取出断货时间最长的商品信息:

..