2017-12-12 20 views
1

나는 각 ID에 대해 변수 내에 텍스트가 있는지에 따라 데이터를 분류하려고합니다. 예를 들어 :데이터 파티션을 기반으로하는 사례 명세서

ID Groupname 
1 A 
1 B 
1 F 
2 D 
2 B 
2 C 

내가 원하는 결과는 내가 다음과 같은 일을 할

ID Groupname Category 
1 A   AF 
1 B   AF 
1 F   AF 
2 D   D 
2 B   D 
2 C   D 

것입니다하지만 난/적색 편이는 포스트 그레스에서

Select * , 
CASE WHEN A,F in groupname (partition by id) THEN AF 
    WHEN D in groupname (partition by id) THEN D 
     .... 
    ELSE null END 
FROM table 

답변 동작하지 않습니다 크게 감사하겠습니다!

편집 :

나는 JNevill가 가져왔다 F와 함께 문제를 해결했습니다.

EDIT2 :

한 사용자 만 한 조합을 필요로하는 경우 작동하는 간단한 솔루션을 제안했다. 예 : F 또는 A를 보면 AF입니다. 하지만 A와 F를 볼 필요가 있으면 작동하지 않습니다. 여기

는 간단한 해결책이다

SUM (CASE WHEN (20,28,19,27)을 1 단에서 콤보) 난 경우 1,000

(log_id 의한 분할) = 1 이상의 조합을 원한다 나는 매우 긴 코드를 생성하는 다음을해야한다. 이 작업을 수행하는 더 쉬운 방법이 있습니까?

WHEN 합계 ((20,28,19,27)에 1을 더한 다음) 1 (파티션 by log_id) = 1 을 합계 할 때 (1048,598,428에 다음 1 끝) (log_id에 의해 파티션) = 다음 1 당신은 파티션과 사건에 대해 맞아 1000

+0

샘플 데이터에'GROUPNAME'으로'F'가 없습니다. 왜'B'가'AF'라는 가치를 얻겠습니까? 'ID'가 '2'에 A와 F가 있으면 어떻게 될까요? 그것은'D' 또는'AF'를 얻을 것인가 아니면'2'가 그런 상황을 다루는 새로운 기록이있을 것인가? – JNevill

답변

0

, 그것은 그냥 조건 집계

select 
* 
,case 
    when sum(case when groupname in ('A','F') then 1 end) over (partition by id)=1 then 'AF' 
    when sum(case when groupname in ('D') then 1 end) over (partition by id)=1 then 'D' 
end as category 
from t 

한 메모를 요구하는 당신은 A와 F의 한 쌍을 원하는 경우 이 구문으로 AF 카테고리를 만들 수는 없습니다 ... count(distinct case...) over()은 오류를 반환하고 더 복잡한 쿼리가 필요하지만, F가 샘플 데이터에 없으므로 필요 없습니다.

+0

안녕하세요. 고맙습니다. F 님과 JNevill이 제기 한 문제를 해결했습니다. 그러면 어떻게 조합 할 수 있습니까? 나는 다음과 같은 코드를 가지고 있지만 길고 지저분 해 많은 데이터를 분류하기 위해 방대한 질의를 작성해야하며 더 깨끗한 코드를 선호한다. 여기 내가 함께 일하는 것이있다. 나는 당신이 한 일에 and 문을 적용하기 만합니다. 이 작업을 수행하는 더 깨끗한 방법이 있습니까? WHEN 합계 ((20,28,19,27) 다음에 1 끝) 콤보 (log_id를 통한 파티션) = 1 및 (파티션의 경우 (1048,598,428) by log_id) = 1 그 다음 1000 –