2017-12-06 11 views
1

Oracle에서 WITH 절을 사용하여 예상보다 낮은 결과를 얻으려고합니다.with oracle with 절

Sample Data 
Id   C_Symbol C_Id 
1001  DD   201 
1001  VR   202 
1002  VR   203 
1002  AS   205 
1002  QA   206 
1003  DD   207 
1003  QA   208 
1004  AS   209 
1004  QA   210 

예상

Id   IS_DD C_Id(min c_id for each id) 
1001  Y  201 
1002  N  203 
1003  Y  207 
1004  N  209 

의미 : 어떤 ID가 c_symbol에서 DD가 포함되어있는 경우가 분 C_ID로 플래그 Y를 반환해야합니다.

WITH 절을 사용하여이 작업을 시도했지만 도움이되지 않습니다.

WITH A_Info As 
    (Select id, c_symbol, c_id from XYZ), 
    DD_Info As 
    (select id, (case when c_symbol = 'DD' then 'Y' else 'N' END As MD), 
    row_number() over(partition by a_id order by c_id) as RN) 
select * from DD_info where RN = 1; 

이렇게하면 행을 실행하므로 다른 해결책을 찾고 있습니다. 난 그냥 집계를 사용하는 것이

+0

ID의 모든 * 기호가 'DD'이거나 가장 낮은 'c_id'의 기호가 DD 인 경우에만 논리가 적용됩니까? 처음 두 행에 대한 기호가 바뀌면 VR/201과 DD/202를 가질 수 있도록 플래그 값을 1001로 설정해야합니까? –

+0

@AlexPoole : 예, ID가 'Y'이면 'N'을, ID가 –

+0

인 최소 'c_id'를 반환해야하는 c_symbol 'DD'가 있습니다. 실제로는 더 명확하지 않지만 그래도 플래그를 원한다고 생각됩니다. 그 시나리오에서는 'Y'가됩니다. 아마도 : "ID가'c_symbol'을 DD로 설정 한'c_id'을 갖고 있다면 'Y'를, 그렇지 않으면 'N'을 더하고 그 ID에 대해 가장 낮은'c_id'를? 더 나은 샘플 데이터와 결과를 얻기 위해 질문을 편집하면이 사실을 명확하게 알 수 있습니다. 그러나 그것이 맞다면 Gordon Linoff의 집계/사례 접근 방식이 당신이 원하는 것을 수행합니다. 맞습니까? –

답변

2

, 감사 :

select id, 
     max(case when c_symbol = 'DD' then 'Y' else 'N' end) as is_dd, 
     min(c_id) as c_id 
from sample 
group by id; 

Here은 예입니다.

+0

고든에게 고마워, 내 문제를 해결하는 데 정말로 도움이되었다. –

+0

이 문장이 어떻게 작동하는지 알고 싶습니다 max (대문자 c_symbol = 'DD', 그 다음에 'Y', 그렇지 않으면 'N'끝) is_dd –