我有CouchDB视图,它以自然顺序给我一个正确的值,当按降序排序时为null,这里是Futon截图:
以下是视图代码:
"informe_precios": {
"map": "function(doc){if(doc.doc_type=='precio'){emit([doc.comprador,doc.fecha.substr(0,4),doc.fecha.substr(5,2)],{precio:doc.precio,litros:doc.litros});}}",
"reduce": "function(keys, values, rereduce){var importe= 0; var totallitros = 0;for(var i = 0; i < values.length; i++) {importe += values[i].precio*values[i].litros;totallitros += values[i].litros;}return importe/totallitros;}"
}
我需要它降序,因为我想得到12个最后的值。
TIA 迭
答案 0 :(得分:1)
您总是假设您的reduce
函数是使用map
函数的输出调用的,即。你没有处理rereduce
情况。
在rereduce
中values
importe/totallitros
将成为之前reduce
次来电的rereduce
值。
你的reduce功能每个月都会获得“每升价格”的平均值,所以因为它是一个平均值,你的values
函数无法实际处理这些数据,因为多个rereduce
即将到来因为没有办法知道他们的平均体重。
因此,您需要更改您的函数以返回计数,以便您可以使用它来加权sum
函数中的平均值(我们还使用内置的function(keys, values, rereduce) {
if (rereduce) {
var length = sum(values.map(function(v){return v[1]}));
var avg = sum(values.map(function(v){
return v[0] * (v[1] / length)
}));
return [avg, length];
}
else {
var importe= 0;
var totallitros = 0;
for( var i = 0; i < values.length; i++) {
importe += values[i].precio * values[i].litros;
totallitros += values[i].litros;
}
return [ importe/totallitros, values.length ];
}
}
函数让事情更简单):
public class Grid {
private int[][] myGrid;
private int x, y;
public Grid(int x, int y) {
myGrid = new int[y][x];
}
}
您在视图中看到的最终结果将是一个数组,因此您始终需要在客户端代码中选择该元素的第一个元素。