2016-05-13 102 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。在後端可能有更好的選擇,特別是如果你使用的是數據庫,在這種情況下,我建議自我加入。 –