2016-08-20 2 views
2

사용자 및 브랜드라는 두 개의 엔티티를 연관시키는 스키마를 설정했습니다. 이 연결은 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는 '여러 브랜드를 다음시피. 사용자 정보를 가져 오는 동안 사용자별로 그룹화 된 값의 합계를 얻으려면 어떻게해야합니까?

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

및 통합 :

가능하면, 최종 결과가 같은 것을해야 하는가? 나는 각각 별개의 userId를 값을 요약하고 싶다면 다음과 같이 나는 쿼리를 작성합니다 다음 '그룹의 일부이어야합니다'에서 그룹 '을 선택 목록에있는 모든 필드를 사용하는 것이

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

주 by '목록 (위의 userId) 또는 집계 표현식 (위의 sum (value)과 같음). 그러나 'name'필드를 결과에 포함 시키려면 어떻게해야할까요? 주어진 이름에 대해 'name'이 항상 동일한 값을 갖고 있다면 '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; 
+0

미안하지만, 나는 잘못 설명했습니다. 이름 필드는 'UserBrand'가 아닌'User' 타입을 가진 문서에 속하므로, 조인이 필요합니다. –