[쿼리질문] 3개씩 끊어서 그중 중간값만 불러오기 질문 0 3 2,320

by Langs [2012.08.08 19:06:44]



VALUE GROUP ID
4562.59 1A ITEM
4568.76 2A ITEM
3006.31 3A ITEM
3587.54 4A ITEM
4022.53 5A ITEM
4027.48 6A ITEM
4121.57 7A ITEM
4501.83 8A ITEM
4539.13 9A ITEM


DB에 다음과 같이 자료가 저장되어 있을때

색으로 구분한것처럼 3 VALUE 값씩 묶어서   3 VALUE값중 MAX, MIN 값 제외 중간값을 불러와야 합니다..

ex)
 첫번째 그룹에서는
4562.59   4568.76   3006.31
===>4562.59 가 select 될수 있도록,
그다움 그룹에서는 4022.53
그다음 그룹에서는 4501.83..

방법이 있을까요~?

by 마농 [2012.08.08 19:18:19]

3개씩 나눌때 정렬 기준이 뭔가요?
두번째 항목인 group 컬럼인가요?
그룹 컬럼의 값이 (숫자 + 알파벳) 인가요? 그럼 정렬이 애매해 지는데...


by 손님 [2012.08.09 09:20:28]

with t as (
select 4562.59 val, '1A' grp, 'ITEM' id from dual union all
select 4568.76 val, '2A' grp, 'ITEM' id from dual union all
select 3006.31 val, '3A' grp, 'ITEM' id from dual union all
select 3587.54 val, '4A' grp, 'ITEM' id from dual union all
select 4022.53 val, '5A' grp, 'ITEM' id from dual union all
select 4027.48 val, '6A' grp, 'ITEM' id from dual union all
select 4121.57 val, '7A' grp, 'ITEM' id from dual union all
select 4501.83 val, '8A' grp, 'ITEM' id from dual union all
select 4539.13 val, '9A' grp, 'ITEM' id from dual
)
select val, grp, id
  from (
select val, grp, id, gid, row_number()over(partition by gid order by val) gdid
   from (
  select val, grp, id, trunc((row_number()over(order by grp) + 2) / 3, 0) gid
   from t
    )
   )
 where gdid = 2

by Langs [2012.08.09 13:34:10]

답변감사합니다.
네, 정렬은 group 으로 해야합니다 ㅠㅠ
그리고 쿼리 올려주신분도 감사합니다.
select 부분부터 가지고 있는 DB 자료에 맞춰서 했는데
처음엔 total row 수는 똑같은데 data가 이상하게 나왔었거든요. 이리저리 해보다
Group값에 'C'를 0으로 replace 해주고 to_number 를 해주니 제대로 정렬 되네요 감사합니다~

 row_number()over 에 대해서 찾아보고 있는데 쉽게 이해가 안가네요.. ㅠ_ㅠ 이해 쉽게 설명좀해주실분 ㅋ
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입