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 40767 게시물 읽기
No. 40767
sql 좀 봐주세요.
작성자
이현정
작성일
2015-04-08 21:12
조회수
7,456

SELECT a.prod_id, a.prod_no, a.order_no, a.order_item_no,a.prod_dt 

             row_number() over (partition by a.prod_id, a.prod_no
                                 order by a.prod_dt) rank
        FROM order a,    -- order 데이터 50만건
             (SELECT rownum rank FROM emp WHERE rownum <= 10000) b   

          WHERE a.qty >= b.rank
         AND a.ordr <> 'TL'
         AND a.prod_id = 'PPU101'   -- 조건절을 붙이면 데이터 5만건
         AND ROWNUM <10000

오래 걸리네요.

1.  row_number() over (partition by a.prod_id, a.prod_no
                                 order by a.prod_dt) rank
    에서 인덱스를 만들려면 어떻게 만들어 줘야 할까요?

    -

2.   SELECT rownum rank FROM emp WHERE rownum <= 10000) b   --> 무엇을 하고자 하는건지 이해가 안가네요?
       WHERE a.qty >= b.rank   ~~~

      AND ROWNUM <10000

       - 무슨 의미인가요? 이해할수가 없네요.

      - 더 좋은 방법이 없나요? 이놈때문에 늦어지는것 같은데요.

   

3. 전제적으로 sql을 변경한다면 어떻게 해야 하나요?


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

전체 SQL 의 의미는...
a 에서 조건에 맞는 자료 추출뒤
각 건마다 qty 수만큼 행을 복제해서 늘리는 것입니다.


여기서 b 는 행 복제용 숫자의 집합이구요.
왜? 행복제를 하는지는 해당 업무 요건을 확인하셔야 하는 문제구요.
행복제를 위해 사용된 emp 테이블은 특별한 의미가 있는건 아니구요.
테이블을 읽으므로 인해 비효율이 발생될 수 있습니다.
다음과 같이 변경하세요.
(SELECT LEVEL rank FROM dual CONNECT BY LEVEL <= 10000) b


그리고 행 복제후 row_number 과 rownum 을 동시에 사용하는데???
이부분은 이해가 안가는 부분이네요.
원하시는 결과를 도출하기 위한 로직이 잘못되었을 가능성이 있습니다.
원하시는 결과에 대한 설명을 해주시면 좋겠네요.
지금 쿼리는 올바른 쿼리가 아니라고 판단됩니다.

마농(manon94)님이 2015-04-09 08:53에 작성한 댓글입니다.

PROD NO ORD_NO DT QTY RANK
PPU 1111 s001 20131127 2 1
PPU 1111 s002 20131127 2 2
PPU 2222 s003 20131127 1 1
PPU 3333 s004 20131127 2 1
PPU 3333 s005 20131127 2 2
PPU 4444 s006 20130730 4 1
PPU 4444 s007 20130730 4 2
PPU 4444 s008 20130730 4 3
PPU 4444 s009 20130730 4 4
PPU 5555 s010 20130730 14 1
PPU 5555 s011 20130730 14 2
PPU 5555 s012 20130730 14 3
PPU 5555 s013 20130730 14 4

 

위의 rank컬럼의 내용을 만들려고 합니다.

알아보니 RANK를 위해서 b테이블을 만들은 sql인것 같은데요.

엄청 오래 걸리네요.

 

 - prod, no 가 같고 qty도 같을때 rank가 1로 만 나오는게 아니라

   임의적으로 순위를 1,2,3,4로 메기기 위한 sql인것 같습니다.

부탁드립니다.

이현정님이 2015-04-09 13:27에 작성한 댓글입니다. Edit

-- 말씀하신 대로라면 b 는 아무짝에도 쓸모가 없는...
-- 성능저하만 시키는 주범이 되겠습니다.
-- a 만 조회해 온뒤 row_number 로 번호만 부여하면 되겠습니다.
SELECT a.prod_id
     , a.prod_no
     , a.order_no
     , a.order_item_no
     , a.prod_dt
     , a.qty
     , ROW_NUMBER() OVER(
       PARTITION BY a.prod_id, a.prod_no
       ORDER BY a.order_no) rn
  FROM order a
 WHERE a.ordr <> 'TL'
   AND a.prod_id = 'PPU101'
;

마농(manon94)님이 2015-04-09 17:12에 작성한 댓글입니다.

마농님 감사합니다.

그럼

PROD NO ORD_NO DT QTY RANK
  PPU
1111 s001 20131127 2 1
PPU 1111 s001 20131127 2 2
PPU 1111 s001 20131127 2 3
PPU 1111 s001 20131127 2 4
PPU 1111 s001 20131127 2 5
PPU 1111 s001 20131127 2 6
PPU 1111 s001 20131127 2 7
PPU 1111 s001 20131127 2 8
PPU 1111 s001 20131127 2 9
PPU 5555 s010 20130730 2 1
PPU 5555 s010 20130730 14 1
PPU 5555 s010 20130730 14 2
PPU 5555 s010 20130730 14 3

이런 rank는 어떻게 구현해야 하나요?

이현정님이 2015-04-09 17:42에 작성한 댓글입니다.
이 댓글은 2015-04-09 17:43에 마지막으로 수정되었습니다. Edit

그룹 기준과 정렬기준만 명확하게 잡으시면 됩니다.
그룹 기준은 Partition By 에
정렬 기준은 Order By 에 기술하면 됩니다.
위 경우엔 그룹기준에 qty 가 추가되면 되겠구요.
특별히 정렬기준은 안보이네요.
그냥 의미없는 1로 정렬하셔도 되구요 (ORDER BY 1)
먼저 제시했던 거 그대로 사용해도 무방하겠는데요?
(ORDER BY order_no) <-- 이것도 무의미하기는 합니다. 같은 값으로 정렬

마농(manon94)님이 2015-04-09 18:32에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
40770sqlldr로 일부 칼럼만 선택 업로드, TEXT 파일 오라클 연결하기 문의 드립니다. [3]
쿼리OTL
2015-04-14
7509
40769sql 또 하나 봐주세요. ^^ [2]
이현정
2015-04-10
7361
40768또 하나 질문 드려요. [1]
이현정
2015-04-09
6456
40767sql 좀 봐주세요. [5]
이현정
2015-04-08
7456
40766oracle sql 로 각 분단위로 지정시간동안의 누적 합계를 구하려고 하는데 쿼리가 안짜지네요 [5]
버들고양이
2015-04-08
6840
40765토드와 was의 실행결과가 틀립니다. [1]
조형래
2015-04-07
6488
40764값의 수가 너무 많습니다.라고 에러가 뜨네요~ 알려주세요^^ [4]
짱초보
2015-04-06
7127
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다