2016-05-13 180 views
1

我有些(简体)数据如下:显示标签

{ "PO": 1353901, "Qty": 1, "Levels": 3 }, 
{ "PO": 1353901, "Qty": 2, "Levels": 3 }, 
{ "PO": 50048309,"Qty": 1, "Levels": 1 }, 
{ "PO": 50048309,"Qty": 4, "Levels": 1 }, 
{ "PO": 50048309,"Qty": 1, "Levels": 1 } 

你在这里看到的数据有两个采购订单,多少它是代表了一个独特的产品每一行,是用过的。您还会看到这些产品分布在多少个层面上。

有助于了解成本的维度是材料密度。也就是说,每个级别使用了多少物品。在1353901的情况下,在三个级别上使用了三个项目(数量得到汇总,级别不),导致每个级别一个项目。

对于50048309有六个项目在一个级别上使用,显示更高的植入密度。这告诉我这是一个集中在一个地方的很多工作。

在平面数据上过滤很容易,而且不难划分为范围。以Levels为例:

var levels = ndx.dimension(function (d) { 
    var level = d.Levels; 
    if (level == 1) { 
     return 'One'; 
    } else if (level == 2) { 
     return 'Two'; 
    } else if (level == 3) { 
     return 'Three'; 
    } else { 
     return 'Four +'; 
    } 
}); 

我可以在维度中轻松创建组和范围。

我似乎无法做的是聚合完全相同的东西。我想看看(过滤器)PO每个级别使用的材料数量。获得每张采购订单并不难,但看起来很难分组。下面的例子:

https://jsfiddle.net/efefdtcj/2/

自从我开始用一个维度基于在PO聚集,我得到一排回各PO。

如何根据QtyPerLevel范围获得一行?

回答

2

我认为你需要预先计算。也就是说,使用PO中总数量的值为每个采购订单项添加一个新的属性。当你在这,你还不如计算QtyPerLevel还有:

{ "PO": 1353901, "Qty": 1, "Levels": 3, "TotalQty": 3, "QtyPerLevel": 1 }, 
{ "PO": 1353901, "Qty": 2, "Levels": 3, "TotalQty": 3, "QtyPerLevel": 1 }, 
{ "PO": 50048309,"Qty": 1, "Levels": 1, "TotalQty": 6, "QtyPerLevel": 6 }, 
{ "PO": 50048309,"Qty": 4, "Levels": 1, "TotalQty": 6, "QtyPerLevel": 6 }, 
{ "PO": 50048309,"Qty": 1, "Levels": 1, "TotalQty": 6, "QtyPerLevel": 6 } 

然后在QtyPerLevel和过滤器或组对创建Crossfilter尺寸:

var ndx = crossfilter([ 
     { "PO": 1353901, "Qty": 1, "Levels": 3, "TotalQty": 3, "QtyPerLevel": 1 }, 
     { "PO": 1353901, "Qty": 2, "Levels": 3, "TotalQty": 3, "QtyPerLevel": 1 }, 
     { "PO": 50048309,"Qty": 1, "Levels": 1, "TotalQty": 6, "QtyPerLevel": 6 }, 
     { "PO": 50048309,"Qty": 4, "Levels": 1, "TotalQty": 6, "QtyPerLevel": 6 }, 
     { "PO": 50048309,"Qty": 1, "Levels": 1, "TotalQty": 6, "QtyPerLevel": 6 }]); 
    var qtyPerLevelDim = ndx.dimension(function(d) { return d.QtyPerLevel; }); 
    var qtyPerLevelGrp = qtyPerLevelDim.group(); 
+0

有道理。这可能是出于某种疯狂的mapReduce功能,但我一直在绞尽脑汁寻找一个。不能有完全平坦的数据,但做一些预先聚合可能是最实际的解决方案。 – Wesley

+0

我只是创建一个Map(或d3.map),其中键为PO,值为qty,然后遍历所有数据并聚合Map上的PO数量。然后再次循环并使用从地图查找的总量更新所有记录。这就是如果你使用JavaScript。在后端可能有更好的选择,特别是如果你使用的是数据库,在这种情况下,我建议自我加入。 –