2016-05-13 6 views
1

Ich habe einige (vereinfacht) Daten wie folgt:anzeigen Etikett auf Aggregate (Crossfilter + Reductio)

{ "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 } 

Sie sehen hier Daten für zwei Bestellungen, jede Zeile ein einzigartiges Produkt darstellt und wie es viel war benutzt. Sie sehen auch, auf wie vielen Ebenen diese Produkte verteilt sind.

Eine Dimension zum besseren Verständnis der Kosten ist die Materialdichte. Das heißt, wie viele Artikel pro Level verwendet wurden. Im Fall von 1353901 wurden drei Elemente auf drei Ebenen verwendet (Menge wird aggregiert, Ebenen nicht), was zu einem Element pro Ebene führt.

Für 50048309 werden auf einer Ebene sechs Elemente verwendet, die eine viel höhere Implantatdichte aufweisen. Das sagt mir, es war eine Menge Arbeit an einem Ort konzentriert.

Filtern von flachen Daten ist einfach und nicht schwer in Bereiche zu gruppieren. Nehmen Sie Levels zum Beispiel:

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 +'; 
    } 
}); 

Ich kann einfach erstellen Gruppen und Bereiche innerhalb einer Dimension.

Was ich nicht tun kann, ist genau das gleiche für Aggregate. Ich möchte (Filter) PO nach Anzahl der Materialien pro Ebene betrachten. Es ist nicht schwer, eine Bestellung pro Bestellung zu bekommen, aber es scheint schwierig, in Gruppen zu sehen. Beispiel Unten:

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

Da ich mit einer Dimension gestartet basierend auf Aggregation an den PO, erhalte ich eine Zeile zurück für jeden PO.

Wie bekomme ich eine Zeile zurück pro QtyPerLevel Bereich?

Antwort

2

Ich denke, dass Sie vorberechnen müssen. Das heißt, jeder Bestellposition eine neue Eigenschaft mit dem Wert der Gesamtmenge in der Bestellung hinzufügen. Während Sie gerade dabei sind, dann kann man auch berechnen QtyPerLevel auch:

{ "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 } 

Dann eine Crossfilter Dimension auf QtyPerLevel und Filter oder eine Gruppe auf, dass erstellen:

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

Sinn macht. Es ist möglich, dass es dafür eine Art verrückter mapReduce-Funktion gibt, aber ich habe mir den Kopf zerbrochen, um nach einem zu suchen. Es können keine völlig flachen Daten vorliegen, aber die Voraggregation kann die praktischste Lösung sein. – Wesley

+0

Ich würde einfach eine Map (oder d3.map) mit Schlüsseln erstellen, die POs und Werte als qty enthalten, dann alle Daten durchlaufen und die Bestellmengen auf der Map aggregieren. Dann wiederholen Sie die Schleife und aktualisieren Sie alle Ihre Datensätze mit Summenmengen, die in der Karte nachgeschlagen wurden. Das ist, wenn Sie in JavaScript arbeiten. Im Backend kann es eine bessere Option geben, besonders wenn Sie eine Datenbank verwenden. In diesem Fall würde ich einen Self-Join empfehlen. –