입력한값의 최소수치에 가까운 데이타 결과값을 구할 수 있을까요? 0 10 2,147

by 물개 [SQL Query] [2013.08.09 10:00:14]


테이블에 저장된 데이타는 아래와 같다고 가정하겠습니다.

이름 | 값
A | 1
B | 2.5
C | 3
D | 6
E | 10


만약에 1.1 이라는 값이 들어왔을 때

1이란 값이 있으므로 A라는 값이 출력되어야 합니다.

15가 들어왔을 때는 10이 가장 가까우므로 E 값이 출력되어야 합니다.

간단한 문제하다고 생각했는데 참으로 어렵습니다.

읽어주셔서 감사합니다.
by 우리집아찌 [2013.08.09 10:06:12]
WITH T (이름 , 값) AS (
SELECT 'A' ,1 FROM DUAL UNION ALL
SELECT 'B' ,2.5 FROM DUAL UNION ALL
SELECT 'C' ,3 FROM DUAL UNION ALL
SELECT 'D' ,6 FROM DUAL UNION ALL
SELECT 'E' ,10 FROM DUAL 
)
SELECT * FROM 
(SELECT 이름 , ABS(값 - :val) minVal
FROM T
ORDER BY 2 )
WHERE rownum = 1

by 우리집아찌 [2013.08.09 10:11:23]
-- 값이 두개일수도 있네요 ^^*
WITH T (이름 , 값) AS (
SELECT 'A' ,1 FROM DUAL UNION ALL
SELECT 'B' ,2.5 FROM DUAL UNION ALL
SELECT 'C' ,3 FROM DUAL UNION ALL
SELECT 'D' ,6 FROM DUAL UNION ALL
SELECT 'E' ,10 FROM DUAL 
)

SELECT * FROM
(SELECT 이름, 값 , RANK() OVER(ORDER BY ABS(값 - 4.5 )) rn
FROM T )
WHERE rn = 1

by 물개 [2013.08.09 10:36:04]
답변감사합니다. 우리집아찌님!

토드에서 실행해보니(오라클 ㅠ)

지정되지 않는 열 별칭 이라고 나오네요;

by 우리집아찌 [2013.08.09 10:42:27]
컬럼이 한글이라서 ㅡㅡ;

by 마농 [2013.08.09 10:47:25]

WITH 절에 별칭사용은 11G 부터 가능.


by 우리집아찌 [2013.08.09 10:57:04]
아.. 그렇구낭.. 한글문제가 아니군요..

by 마농 [2013.08.09 10:14:44]
질문이 모호한데요.
1. 입력값보다 작은값 중에 가장 큰 값?
2. 입력값과의 차이가 가장 작은값?
2번의 경우엔 위아래 두건이 동일할 수 있으니 둘다 뽑을지? 우선순위를 정하여 하나만 뽑을지?

by 물개 [2013.08.09 10:33:18]
1번에 해당되는 것만 뽑으면 됩니다.

답변감사합니다 마농님!

by 마농 [2013.08.09 10:35:59]
-- 1. SubQuery
SELECT nm, v
  FROM t
 WHERE v = (SELECT MAX(v) FROM t WHERE v <= :v)
;
-- 2. Order By & Rownum = 1
SELECT *
  FROM (SELECT nm, v
          FROM t
         WHERE v <= :v
         ORDER BY v DESC
        )
 WHERE ROWNUM = 1
;
-- 3. Row_number = 1
SELECT nm, v
  FROM (SELECT nm, v
             , ROW_NUMBER() OVER(ORDER BY v DESC) rn
          FROM t
         WHERE v <= :v
         ORDER BY v DESC
        )
 WHERE rn = 1
;
-- 4. MAX, Keep
SELECT MAX(nm) KEEP(DENSE_RANK LAST ORDER BY v) nm
     , MAX(v)
  FROM t
 WHERE v <= :v
;

by 물개 [2013.08.09 11:00:42]
다양한 방법으로 알려주셔서 감사합니다~~

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