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 31504 게시물 읽기
No. 31504
엄청난 질문..
작성자
한번만
작성일
2007-07-31 09:58
조회수
2,172

흠.. ORACLEDB를 사용하고있습니다.


그런데 오늘의 문제가 조금 그렇군요 --;; 이해가 안되는..


아래를 보아 주세요


게시물 10개가 있습니다

seq    regdat  rank

01    20070701  1

02    20070701  2

03    20070701  3

04    20070702  3

05    20070702  4

06    20070702  2

07    20070702  1

08    20070703  3

09    20070703  1

10    20070704  3


이렇게 있을때..


rank 4개를 뽑습니다.

1,2,3,4등순으로..


그런데 제가 만약 20070704일날 4개를 추출하려고 합니다


이때 20070704일에는 3위 랭크 밖에 없는데.


나머지 1,2,4위 랭크는 가장 최신 게시물의 랭크를 따라서 추출하려고 합니다


그럼 추출되는 순번은


1위 09

2위 06

3위 10

4위 05


이렇게 출력이 되야된다고 합니다..;;


로직을 이해하신분은 제발 SQL문좀 달아주시면 감사하겠습니다..


머리털이 한움큼씩 빠지고 있습니다~

이 글에 대한 댓글이 총 5건 있습니다.
seq 컬럼이...
예를 들어주신것 처럼 01, 02....10.....이렇게 동일한 자릿수로 번호 증가되면서 들어간다는 가정하에..
작성했습니다.
rank 도 숫자형으로 했구요..
rank를 한자리만 잡아도 된다면 char(1)로 하시면 좋을 듯 합니다...

제 맘대로 정해서 테이블을 생성하고...

create table tbl(seq varchar2(20), regdat char(8), rank number(1));


SQL문은 다음과 같습니다. 급조했으니, 상황에 맞게 수정해서 사용하십시오.

select max(to_char(rank)||seq) as aa
from tbl
group by rank;

<결과>

109
206
310
405

 

차영인(Guideposts)님이 2007-07-31 10:34에 작성한 댓글입니다.

rank에 따라 최신일자를 하나씩 구하면 되는 거지요?


테스트 데이터...

WITH

  t AS

    (

    SELECT '01' AS seq, '20070701' AS regdat,  1 AS rank FROM dual UNION ALL

    SELECT '02' AS seq, '20070701' AS regdat,  2 AS rank FROM dual UNION ALL

    SELECT '03' AS seq, '20070701' AS regdat,  3 AS rank FROM dual UNION ALL

    SELECT '04' AS seq, '20070702' AS regdat,  3 AS rank FROM dual UNION ALL

    SELECT '05' AS seq, '20070702' AS regdat,  4 AS rank FROM dual UNION ALL

    SELECT '06' AS seq, '20070702' AS regdat,  2 AS rank FROM dual UNION ALL

    SELECT '07' AS seq, '20070702' AS regdat,  1 AS rank FROM dual UNION ALL

    SELECT '08' AS seq, '20070703' AS regdat,  3 AS rank FROM dual UNION ALL

    SELECT '09' AS seq, '20070703' AS regdat,  1 AS rank FROM dual UNION ALL

    SELECT '10' AS seq, '20070704' AS regdat,  3 AS rank FROM dual

    )


쿼리...

SELECT *

FROM(

    SELECT

          t.*

        , ROW_NUMBER() OVER(PARTITION BY rank ORDER BY regdat DESC) AS rn

    FROM t

    WHERE regdat <= '20070704'

    )

WHERE rn = 1

ORDER BY rank


건승하시길...수고하세요~~

성시현(finecomp)님이 2007-07-31 10:36에 작성한 댓글입니다.

간략하게 샘플 SQL을 만들어 보았습니다.
 * 테이블 : TEST_TAB, COPY_T(1부터 1000까지의 데이타가 있는 테이블)
 * 인덱스 : TEST_TAB_IX1 -> regdat + rank  

SELECT T1.*, 
             NVL(T1.RANK, (SELECT /*+ INDEX_DESC(T3 TEST_TAB_IX1)*/
                                                 T3.SEQ
                                        FROM TEST_TAB T3
                                      WHERE T3.REGDAT < T1.REGDAT
                                          AND T3.RANK      = T2.NO
                                          AND ROWNUM     = 1))
  FROM TEST_TAB T1,
            COPY_T T2
 WHERE T2.NO <= 4
     AND T1.RANK(+) = T2.NO
     AND T1.REGDAT(+) = '20070704'
;


 

빈껍데기님이 2007-07-31 10:38에 작성한 댓글입니다. Edit

정말 감사합니다 큰도움이 되었습니다

한번만님이 2007-07-31 11:05에 작성한 댓글입니다. Edit
select b.seq, a.regdat, a.rank
  from  
  (select rank, Max(regdat) regdat
     from  (
      SELECT '01' AS seq, '20070701' AS regdat,  1 AS rank FROM dual UNION ALL
      SELECT '02' AS seq, '20070701' AS regdat,  2 AS rank FROM dual UNION ALL
      SELECT '03' AS seq, '20070701' AS regdat,  3 AS rank FROM dual UNION ALL
      SELECT '04' AS seq, '20070702' AS regdat,  3 AS rank FROM dual UNION ALL
      SELECT '05' AS seq, '20070702' AS regdat,  4 AS rank FROM dual UNION ALL
      SELECT '06' AS seq, '20070702' AS regdat,  2 AS rank FROM dual UNION ALL
      SELECT '07' AS seq, '20070702' AS regdat,  1 AS rank FROM dual UNION ALL
      SELECT '08' AS seq, '20070703' AS regdat,  3 AS rank FROM dual UNION ALL
      SELECT '09' AS seq, '20070703' AS regdat,  1 AS rank FROM dual UNION ALL
      SELECT '10' AS seq, '20070704' AS regdat,  3 AS rank FROM dual
           )
  where regdat <= '20070704'
  group by rank) a,
 (
    SELECT '01' AS seq, '20070701' AS regdat,  1 AS rank FROM dual UNION ALL
    SELECT '02' AS seq, '20070701' AS regdat,  2 AS rank FROM dual UNION ALL
    SELECT '03' AS seq, '20070701' AS regdat,  3 AS rank FROM dual UNION ALL
    SELECT '04' AS seq, '20070702' AS regdat,  3 AS rank FROM dual UNION ALL
    SELECT '05' AS seq, '20070702' AS regdat,  4 AS rank FROM dual UNION ALL
    SELECT '06' AS seq, '20070702' AS regdat,  2 AS rank FROM dual UNION ALL
    SELECT '07' AS seq, '20070702' AS regdat,  1 AS rank FROM dual UNION ALL
    SELECT '08' AS seq, '20070703' AS regdat,  3 AS rank FROM dual UNION ALL
    SELECT '09' AS seq, '20070703' AS regdat,  1 AS rank FROM dual UNION ALL
    SELECT '10' AS seq, '20070704' AS regdat,  3 AS rank FROM dual
    ) b
where a.rank = b.rank
  and a.regdat = b.regdat

일하면서 공부하는 중입니다....
sql 너무 어렵네요~
sample data는 성시현님꺼 복사해다 슬쩍;;
공부하는 중이라 많은 택흘 부탁드려요~
KKH님이 2007-08-01 14:00에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
31507프로시저에서 결과 행의 수를 어떻게 반환받나요? [3]
강민구
2007-07-31
1578
31506char 과 varchar2 의 조인이 안되는데... [4]
엔키
2007-07-31
1439
31505NUMBER(5) 면 5자리 인가요?
웁스
2007-07-31
908
31504엄청난 질문.. [5]
한번만
2007-07-31
2172
31503out 변수를 어떻게 출력하나요? [3]
강민구
2007-07-31
1790
31501프로시저 실행 [1]
초보
2007-07-30
2194
31500SQL 재사용성에 대해서 [2]
드라군
2007-07-30
1140
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다