2016-08-20 11 views
2

ユーザーとブランドの2つの異なるエンティティを関連付けるスキーマをセットアップしました。この関連付けは、文書UserBrandに格納されます。ユーザーは複数のブランドを持つことができ、各UserBrandドキュメントには、含まれる情報が異なります。ここで複数のグループ化されたドキュメントの合計結果

は、3つの文書の例です。見ての通り

{ 
    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」は複数のブランドをたどります。ユーザー情報をフェッチしている間に、ユーザーのグループ化された値の合計を取得するにはどうすればよいですか?

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) 

が、私はグループにレコードを思えるし、単一のユーザーのための値を合計することはできません。

これまでのところ私はこのクエリによって、両方のドキュメントタイプ(ユーザーとUserBrand)に参加することができています。単一のクエリでこれを行うことは可能ですか?なぜあなたは「参加」ではなく、単にの「グループによって」使用している

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

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

は、あなたの最終的な結果として、何を見ていますか? –

+0

@RoiKatz上記のクエリを実行すると、多かれ少なかれ同じ例が得られます。私はドキュメントを繰り返して値を合計することができたと思いますが、レコードが増えれば、単一のクエリがより効率的になると考えていました。 –

答えて

0

と集計:

可能な場合には、最終的な結果は次のようにすべきですか? 「でグループ」を使用した場合、選択リスト内のすべてのフィールドが「グループの一部のいずれかでなければならないということ

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

注:私は、それぞれの個別のuserIdの値を合計したい場合は、以下のように、私は、クエリを記述しますby 'リスト(上記のuserId)または集計式(上記のsum(value)など)しかし、結果にフィールド 'name'を含める場合はどうすればよいでしょうか?指定されたIDに対して常に '名前'が同じ値を持つことが分かっている場合は、 'max'や 'min'などの集計関数を使用して値を表示できます(同一の値の集合の最大値は値):異なる値を持っていると思われる「brandId」のようなフィールドについては、

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

、あなたは「brandId」はすべて異なる値をとるであろう、「ARRAY_AGG」のような集計関数を使用したいと思いますそれらを配列に入れてください。例えば、

select userId, max(name), sum(value), array_agg(distinct brandId) from bucket group by userId; 
+0

申し訳ありませんが、私はあまり説明しませんでした。 nameフィールドは、 'User'型ではなく' User'型の文書に属します。したがって、結合が必要です –

関連する問題