database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 37865 게시물 읽기
No. 37865
쿼리 random 추출 기능 질문드립니다.
작성자
빛을타고(빛을타고)
작성일
2010-08-17 10:59
조회수
4,485

안녕하세요. 늘 여기서 도움받고 가는 개발자입니다.

이번엔 난수 추출기능을 두고 고민을 하다가 질문을 드립니다. 많은 선배분들 조언 부탁드립니다.

구성원 | 6 ~15 | 16~24 |  25~35 |  36~48 |  49~63 |  64~80 | 82~99 |  100~120 |
호수     | 3이상 | 4이상  |  5이상  |   6이상  |  7이상  | 8이상   |  9이상  |  10이상     |

제한 사항은 이렇구요. 임의 호수를 추출해야합니다.  예를 들면 6명에서 15명의 집단이면 그 안에서 무작위로 100,24,36,3(3명이상이므로) 번째 호수 이런식으로 뽑아내야합니다.

즉 DBMS_RANDOM.VALUE 을 사용하여 추출해야 하는건데요.

쿼리 짜는데 부족함이 느껴져서 도움을 얻고자 글을 올립니다.

제가 짠건

                SELECT SEQ
                    FROM (
                                  SELECT SEQ
                                      FROM A_RANDOM
                                  WHERE ROWNUM < = '45'
                                  ORDER BY DBMS_RANDOM.VALUE
                                 )
                WHERE ROWNUM <= 6
                ORDER BY 1;

이렇게 됐는데 솔직히 제가 원하는거랑은 아닙니다 ㅠㅠ

선배님들 조언 부탁드립니다.(--)(__)

 

이 글에 대한 댓글이 총 13건 있습니다.

질문이 도무지 이해가 안가네요.

마농(manon94)님이 2010-08-17 11:21에 작성한 댓글입니다.

제가 설명을 잘 못하나 봅니다. ㅠㅠ

예를들어 40명의 인원 중에 뽑으라고 한다면 구성원에서는 36~48 에 해당하기 때문에

40명 중에 6명 이상을 랜덤하게 추출해야 한다는 거예요. ㅠㅠ

 

빛을타고(빛을타고)님이 2010-08-17 11:27에 작성한 댓글입니다.
이 댓글은 2010-08-17 11:38에 마지막으로 수정되었습니다.

아 ㅠㅠ 제가 설명을 잘 못하나 보네요.

하고 싶은걸 말씀드리면,

먼저 SELECT COUNT(*) AS CNT  FROM AA   <== 를 조회해서 총 구성원을 뽑구요.

예를 들어 CNT 값이 40 이 나왔다고 하면 위에 표에선 36~ 48 사이에 해당하기 때문에

랜덤하게 6명이상을 추출해야한다는 거였습니다 ㅠㅠ

빛을타고(빛을타고)님이 2010-08-17 11:47에 작성한 댓글입니다.
이 댓글은 2010-08-17 11:48에 마지막으로 수정되었습니다.

추첨로직이군요~ ^^

암비님이 2010-08-17 13:11에 작성한 댓글입니다. Edit

아.. 그러고 보니 추첨 로직이네요.암비님.

빛을타고(빛을타고)님이 2010-08-17 13:25에 작성한 댓글입니다.

WITH t AS
(
SELECT ROWNUM seq FROM dual CONNECT BY LEVEL <= 45
)
SELECT seq
  FROM (SELECT seq
          FROM t
         ORDER BY DBMS_RANDOM.VALUE
        )
 WHERE ROWNUM <= (SELECT DBMS_RANDOM.VALUE(
                         CASE WHEN COUNT(*) BETWEEN   6 AND  15 THEN  3
                              WHEN COUNT(*) BETWEEN  16 AND  24 THEN  4
                              WHEN COUNT(*) BETWEEN  25 AND  35 THEN  5
                              WHEN COUNT(*) BETWEEN  36 AND  48 THEN  6
                              WHEN COUNT(*) BETWEEN  49 AND  63 THEN  7
                              WHEN COUNT(*) BETWEEN  64 AND  80 THEN  8
                              WHEN COUNT(*) BETWEEN  81 AND  99 THEN  9
                              WHEN COUNT(*) BETWEEN 100 AND 120 THEN 10
                              WHEN COUNT(*) > 120 THEN 11
                              WHEN COUNT(*) <   6 THEN  1
                          END, COUNT(*)+1) v
                    FROM t
                  )
;

마농(manon94)님이 2010-08-17 13:26에 작성한 댓글입니다.
이 댓글은 2010-08-17 15:36에 마지막으로 수정되었습니다.

감사합니다. 마농님.^^

설명하는 법을 더 잘 이해할수 있도록 해야겠습니다.

작성해 주신 쿼리 감사합니다.^^

 

빛을타고(빛을타고)님이 2010-08-17 13:31에 작성한 댓글입니다.

ㅠㅠ님 작성해 주신 쿼리 감사합니다.

빛을타고(빛을타고)님이 2010-08-17 13:44에 작성한 댓글입니다.

 WHERE ROWNUM <= (SELECT CASE WHEN COUNT(*) BETWEEN   6 AND  15 THEN  3
                              WHEN COUNT(*) BETWEEN  16 AND  24 THEN  4
                              WHEN COUNT(*) BETWEEN  25 AND  35 THEN  5
                              WHEN COUNT(*) BETWEEN  36 AND  48 THEN  6
                              WHEN COUNT(*) BETWEEN  49 AND  63 THEN  7
                              WHEN COUNT(*) BETWEEN  64 AND  80 THEN  8
                              WHEN COUNT(*) BETWEEN  82 AND  99 THEN  9
                              WHEN COUNT(*) BETWEEN 100 AND 120 THEN 10
                              WHEN COUNT(*) > 120 THEN 11
                              WHEN COUNT(*) <   6 THEN  1
                          END) v
                    FROM t
                  )

 

요거 비싼 쿼린데~ ㅋㅋ

 

요런 해법도 있긴 하군요..

호~~ 오~~~

 

멋진데요~ ^^

 

잘 쓰겠슴다~ 무흐흐흐흐~

암비님이 2010-08-17 15:24에 작성한 댓글입니다. Edit

수치에 규칙성이 있네요. 6-15 만 뺀다면 말이죠.
6-15를 1-3(1), 4-8(2), 9-15(3) 로 바꾼다면 간단한 수식만으로도 가능하겠네요.


WITH t AS
(
SELECT ROWNUM seq FROM dual CONNECT BY LEVEL <= 45
)
SELECT seq
  FROM (SELECT seq
          FROM t
         ORDER BY DBMS_RANDOM.VALUE
        )
 WHERE ROWNUM <= (SELECT DBMS_RANDOM.VALUE(FLOOR(SQRT(cnt)), cnt+1)
                    FROM (SELECT COUNT(*) cnt FROM t)
                  )
;

마농(manon94)님이 2010-08-17 15:50에 작성한 댓글입니다.

마지막라인에 조회갯수를 구하는 값에 다시 random 이 들어가면~ ^^;

암비님이 2010-08-17 21:58에 작성한 댓글입니다. Edit

조회갯수가 3으로 딱 정해진게 아니고 3이상(3~15)이라 했으니

조회갯수 자체도 정해지지 않은 임의의 값입니다.

그래서 Random 함수를 다시 사용한거구요.

마농(manon94)님이 2010-08-18 08:32에 작성한 댓글입니다.

아 이런 제가 잘못 봤군요~ ^^;

 

딱 3이라고 이해 했었네요.

암비님이 2010-08-18 08:56에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
37868세로 데이터의 가로 표시 질문드립니다.. [2]
한수진
2010-08-18
3716
37867도움을 요청해요.. (ㅜㅡ) [6]
이상영
2010-08-17
3223
37866계층 구조에서 CONNECT BY PRIOR 조건 추가 가능한가요? [2]
차이
2010-08-17
3783
37865쿼리 random 추출 기능 질문드립니다. [13]
빛을타고
2010-08-17
4485
37864alert log에 Resource Manager 몬가요???
황푸리엔
2010-08-17
2712
37863한 컬럼에 다중 제약조건 가능한가요? [1]
j1y3
2010-08-17
2909
37862전월대비 증감및 증감율 구하는 쿼리 도움 부탁드립니다. [4]
박현
2010-08-16
8622
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다