创建聚合函数以报告Google DataTable中最受欢迎的内容

时间:2014-06-27 06:11:04

标签: google-visualization

我有一个Google DataTable,如下所示:
var data = new google.visualization.DataTable(); data.addColumn('string', 'City'); data.addColumn('string', 'Model');
data.addColumn('number', 'Sold'); data.addRows([ ["Melbourne","Ford",10], ["Perth","Ford",2], ["Melbourne","Ford",7], ["Melbourne","Holden",25], ["Perth","Holden",25], ["Melbourne","Holden",12], ["Melbourne","Ford",11] ]);

我想要做的是按城市分组,并报告该城市的累计售出价值最高的模型。

返回的结果是:

City Model Melbourne Holden Perth Ford

从我对Google Visualization API的阅读中可以编写自定义聚合函数,但这超出了我的有限经验。

非常感谢任何协助。

2 个答案:

答案 0 :(得分:0)

这需要双重分组:第一次获得每个城市每个模型的总销售量,以及第二次获得最受欢迎的模型。

var g1 = google.visualization.data.group(data, [0, 1], [{
    type: 'number',
    label: 'Total Sold',
    column: 2,
    aggregation: google.visualization.data.sum
}]);
// create a view to merge columns 1 and 2 together for the grouping below
var view = new google.visualization.DataView(g1);
view.setColumns([0, {
    type: 'string',
    label: 'Model QTy Sold',
    calc: function (dt, row) {
        var o = {model: dt.getValue(row, 1), sold: dt.getValue(row, 2)};
        return JSON.stringify(o);
    }
}]);
var g2 = google.visualization.data.group(data, [0], [{
    type: 'string'
    label: 'Most Popular'
    aggregation: function (values) {
        var max = null, ret = null;
        for (var i = 0; i < values; i++) {
            var o = JSON.parse(values[i]);
            if (max == null || o.sold > max) {
                max = o.sold;
                ret = o.model;
            }
        }
        return ret;
    }
}]);

g2应包含按城市分组的销售额最高的模型。如果两个模型之间存在联系,则会返回values数组中的第一个模型(可能values将按型号名称排序,但不保证这一点。)

答案 1 :(得分:0)

我对asgallant的第二组进行的编辑是:

var g2 = google.visualization.data.group(view, [0], [{
type: 'string',
label: 'Most Popular',
column: 1,
aggregation: function (values) {
    var max = null, ret = null;
    for (var i = 0; i < values.length; i++) {
        var o = JSON.parse(values[i]);
        if (max == null || o.sold > max) {
            max = o.sold;
            ret = o.model;
        }
    }
    return ret;
}

}]);