我已经设置了一个架构,我将两个不同的实体关联起来:用户和品牌。此关联存储在文档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
}
答案 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;