2016-05-13 3 views
1

Я несколько (упрощенно) данные следующим образом:Показать Этикетка на Совокупности (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 } 

Вы видите здесь данные для двух заказов на закупку, каждая строка, представляющая собой уникальный продукт и сколько это было используемый. Вы также видите, сколько уровней были распределены по этим продуктам.

Измерение, которое поможет понять стоимость - плотность материала. То есть, сколько элементов было использовано на уровень. В случае 1353901 было три элемента, используемые на трех уровнях (Qty получает агрегированное значение, Levels do not), в результате чего один элемент за уровень.

Для 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, я получаю строку обратно для каждого ПО.

Как получить один ряд назад на QtyPerLevel диапазон?

ответ

2

Я думаю, вам нужно предварительно вычислить. То есть добавьте новое свойство для каждой строки PO со значением общей суммы в 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 } 

Затем создайте Crossfilter измерение на QtyPerLevel и фильтр или группу на том, что:

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

Я бы просто создал карту (или d3.map) с ключами, являющимися PO и значениями qty, затем пронумеровали все ваши данные и суммировали количества заказов на карте. Затем повторите цикл и обновите все свои записи совокупными количествами, поднятыми с карты. Вот если вы работаете в JavaScript. На бэкэнд может быть лучший вариант, особенно если вы используете базу данных, и в этом случае я бы рекомендовал самоподключение. –