在这种情况下,您可以使用一种或两种方法:填充稀疏填充的字段(即Date
and ItemCode
)或使用IntervalMatch
.
这是一些用于填充字段的脚本。通常,如果您只有一个要填充的字段(即只有Date
),这非常简单,但是,由于您的字段中可能有多个字段ItemCode
,因此[PRICE LIST TABLE]
我们必须评估ItemCode
表中每个唯一 s 的日期范围 - 最简单做到这一点的方法是通过一个循环来检查每个的范围并相应地填充。
在下面的示例中,我获取了您的一些示例数据并创建了一些内联表来表示您的源数据,我还添加了一个新表ItemCode
来演示如果您的价格表中有多个具有重叠日期范围的情况会发生什么。请注意,这可能没有像应有的那样优化,并且可能有一种更整洁的方式,但它可以工作(!)
[PRICE LIST TABLE]:
LOAD
*
INLINE [
PricingDate, ItemCode, Price
22/12/2015, AB101, 95
27/12/2015, AB101, 69
23/12/2015, AB102, 23
29/12/2015, AB102, 43
];
TempTable_Pricing:
NOCONCATENATE
LOAD
PricingDate,
ItemCode,
Price
RESIDENT [PRICE LIST TABLE];
DROP TABLE [PRICE LIST TABLE];
ItemList:
NOCONCATENATE
LOAD DISTINCT
ItemCode
RESIDENT TempTable_Pricing;
FOR i = 0 to NoOfRows('ItemList') - 1
LET item = peek('ItemCode',i,'ItemList');
MinMaxDate:
LOAD
Min(PricingDate) as MinDate,
Max(PricingDate) as MaxDate
RESIDENT TempTable_Pricing
WHERE ItemCode = '$(item)';
Let vMinDate = Peek('MinDate',-1,'MinMaxDate') - 1;
Let vMaxDate = Peek('MaxDate',-1,'MinMaxDate') ;
JOIN (TempTable_Pricing)
LOAD
Date(recno()+$(vMinDate)) as PricingDate,
'$(item)' as ItemCode
AUTOGENERATE vMaxDate - vMinDate;
PricingTable_Temp_$(i):
NOCONCATENATE LOAD
PricingDate as PricingDate_Temp,
if(isnull(ItemCode), peek(ItemCode), ItemCode) as ItemCode,
if(isnull(Price), peek(Price), Price) as Price
RESIDENT TempTable_Pricing
ORDER BY ItemCode, PricingDate;
DROP TABLE MinMaxDate;
PricingTable:
LOAD
PricingDate_Temp as Date,
ItemCode,
Price
RESIDENT PricingTable_Temp_$(i);
DROP TABLE PricingTable_Temp_$(i);
NEXT
DROP TABLE ItemList;
DROP TABLE TempTable_Pricing;
[ORDERS TABLE]:
NOCONCATENATE
LOAD
date(OrderDate) as Date,
ItemCode,
Quantity
INLINE [
OrderDate, ItemCode, Quantity
22/12/2015, AB101, 1
24/12/2015, AB101, 2
27/12/2015, AB101, 4
26/12/2015, AB102, 3
29/12/2015, AB102, 1
];
INNER JOIN ([ORDERS TABLE])
LOAD
Date,
ItemCode,
Price
RESIDENT PricingTable;
DROP TABLE PricingTable;
结果如下表: