多个分组文档的总和结果

时间:2016-08-20 14:26:57

标签: couchbase n1ql

我已经设置了一个架构,我将两个不同的实体关联起来:用户和品牌。此关联存储在文档UserBrand中。用户可能拥有多个品牌,并且在每个UserBrand文档中,其中包含的信息都不同。

以下是三个文件的示例:

{
    type: "UserBrand",
    userId: "x",
    brandId: 1,
    value: 100
}

{
    type: "UserBrand",
    userId: "x",
    brandId: 2,
    value: 50
}

{
    type: "UserBrand",
    userId: "y",
    brandId: 1,
    value: 150
}

如您所见,用户' x'遵循多个品牌。如何在获取用户信息的同时获取按用户分组的值的总和?

到目前为止,我可以通过此查询加入两种文档类型(User和UserBrand):

SELECT ub.*, u.name FROM bucket as ub JOIN bucket as u ON KEYS "User_" || ub.userId WHERE ub.type="UserBrand" AND u.type="User" AND (ub.brand=1 OR ub.brand=2)

但我似乎无法对记录进行分组并对单个用户的值求和。是否可以在单个查询中执行此操作?

如果可能,最终结果应该是:

{
    type: "UserBrand",
    name: "name1',
    userId: "x",
    brandId: 1,
    value: 150
}

{
    type: "UserBrand",
    name: "name2',
    userId: "y",
    brandId: 1,
    value: 150
}

1 个答案:

答案 0 :(得分:0)

为什么使用'加入'而不是简单地'分组'和聚合?如果我想对每个不同的userId的值求和,我会按如下方式编写一个查询:

select userId, sum(value) from bucket group by userId;

请注意,使用“分组依据”时,选择列表中的每个字段都必须是“分组依据”列表(上面的userId)或聚合表达式(如上面的sum(值))的一部分。但是如果你想在结果中包含字段'name'怎么办?如果你知道'name'对于给定的id总是具有相同的值,你可以使用像'max'或'min'这样的聚合函数来调出值(因为一组相同值的最大值将是任何值值):

select userId, max(name), sum(value) from bucket group by userId;

对于像'brandId'这样似乎有不同值的字段,你需要使用像'array_agg'这样的聚合函数,它将获取'brandId'的所有不同值并将它们放在一个数组中。如,

select userId, max(name), sum(value), array_agg(distinct brandId) from bucket group by userId;
相关问题