필드조건에 따른 최대값 최소값 가져오기 0 7 3,801

by BCPMAN [SQL Query] [2015.03.23 15:17:50]


아래와 같이 테이블에 값이 세팅되어 있을때 LIMIT 필드 조건에 따라 ID를 그룹바이하여 최대값 최소값

구하는 쿼리를 깔끔하게 하고 싶은데 잘안되네요; 

조건 : 동일 ID그룹에서 LIMIT 값이 'Y' 인값중 최소값을 가져오며, LIMIT 값이 'Y' 인것이 없으면 'N' 값중 최대값을

가져온다.

ID     VAL  LIMIT
100    01    N
100    03    Y
100    02    Y
200    03    N
200    03    N
200    04    N
300    01    Y
300    01    N
300    01    N

-------------------------------------------------

원하는 결과..

ID     VAL  LIMIT
100    02    Y
200    04    N
300    01    Y

val필드에 min(), max()를 각각 걸어 그룹바이한 결과를 union해야하나..  고민중입니다.ㅠ

by 쿼리back [2015.03.23 15:42:43]


with t AS                                                 
(select '100' ID ,  '01' val  , 'N' LIMIT from dual union all 
select '100'  ,  '03'  ,  'Y'            from dual union all
select '100'  ,  '02'  ,  'Y'            from dual union all
select '200'  ,  '03'  ,  'N'            from dual union all
select '200'  ,  '03'  ,  'N'            from dual union all
select '200'  ,  '04'  ,  'N'            from dual union all
select '300'  ,  '01'  ,  'Y'            from dual union all
select '300'  ,  '01'  ,  'N'            from dual union all
select '300'  ,  '01'  ,  'N'            from dual  )
select id , limit , decode(limit , 'Y' , minVal , maxVal) val
from (select id,limit,min(val) minVal , row_number() over(partition by id order by  limit desc) rnk , max(val) maxVal
from t
group by id,limit)
where rnk = 1

by BCPMAN [2015.03.23 15:47:35]

답변 감사드립니다.  근데 ID별로 랭킹을 매겨 가장 작은값을 가져오기는 하나...

동일그룹ID 값의 LIMIT 필드 조건이 전부 'N' 인 경우는 최대값을 가져와야합니다..ㅠ


by 쿼리back [2015.03.23 17:16:06]

죄송합니다. 난독증이 좀 심해서리 OTL... 수정하고 갑니다.~ㅠㅠ


by 마농 [2015.03.23 15:53:09]
SELECT id
     , NVL(MIN(DECODE(limit, 'Y', val)), MAX(DECODE(limit, 'N', val))) val
     , MAX(limit) limit
  FROM t
 GROUP BY id
 ORDER BY id
;

 


by BCPMAN [2015.03.23 15:59:10]

FUNCTION을 만들어서 적용하려고 했는데.. 간단히 decode를 이용하여 해결이 되네요.

마농님 감사드립니다.(__)


by 느훼훼 [2015.03.23 16:02:01]

진짜 너무나도 자주 사용되는 nvl과 decode로 저렇게나 쉽게 해결되다니;;;


by rain748 [2015.03.23 16:34:03]

with t (id,val,limit) as (
select 100,'01','N' from dual union all
select 100,'03','Y' from dual union all
select 100,'02','Y' from dual union all
select 200,'03','N' from dual union all
select 200,'03','N' from dual union all
select 200,'04','N' from dual union all
select 300,'01','Y' from dual union all
select 300,'01','N' from dual union all
select 300,'01','N' from dual
)
select id,decode(limit,'Y',MN,'N',MX),LIMIT
FROM (
select id,limit,max(val) keep(dense_rank first order by limit desc) mx
               ,min(val) keep(dense_rank first order by limit desc) mn
               ,dense_rank() over(partition by id order by limit desc) dr
from t
group by id,limit
)
where dr = 1

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입