rownum 관련질문입니다. 1 9 1,361

by 에브리데이나잇쇼 [SQL Query] 논리적구조 [2015.03.12 17:59:23]


dddd.jpg (40,666Bytes)

rownum인 ct부분 컬럼에서

63번째부터 1부터 되게 하려고 합니다.(63을 명시하면 안됩니다. 데이터가 63일수도 있고 아닐수도 있습니다.)

즉 ct가 null인 다음부터 ct가 1로 바뀌어야 합니다.

어떤식으로 쿼리를 짜야할지 도움을 요청합니다.

->조건으로 num컬럼이 3일때부터는 ct가 1이 될경우를 줄 수 있습니다.

by 신이만든짝퉁 [2015.03.12 18:12:26]

이런걸 원하시나요?

SELECT   DECODE(MOD(CT, 62), 0, 62, MOD(CT, 62)) RN, CT
    FROM (SELECT     LEVEL CT
                FROM DUAL
          CONNECT BY LEVEL < 101)
ORDER BY CT;


 


by 에브리데이나잇쇼 [2015.03.13 08:29:34]

62번째인걸 명시해주면안됩니다.

62번째일수도 아닐수도있어서요...


by 마농 [2015.03.13 09:09:13]

63 이라는 결과를 가지고 질문하셔서 답변이 그렇게 달릴수밖에 없죠...

결과가 아닌 이유를 설명해 주셔야죠...


by 에브리데이나잇쇼 [2015.03.13 10:01:57]

도움부탁드리겟습니다.

 


by 마농 [2015.03.13 10:44:49]

설명이 애매합니다. 설명이 부족합니다.

설명을 자세히 해주세요.

정렬기준이 뭔지도 명확해야 하구요.

중간에 나오는 널은 원래 자료가 그런건지? 쿼리 수행결과로 나온 산출물인지?


by 에브리데이나잇쇼 [2015.03.13 11:17:08]

해결했습니다.


by 창조의날개 [2015.03.13 13:00:05]

AA 테이블이 원본 데이터 테이블로 렌덤하게 NULL이 발생 하도록 했습니다.

NULL을 만나면 다음 로우부터 채번을 다시 하도록 해 보았습니다.

뭐 해결 하셨다고 하니 필요없겠지만...

재미삼아 만들어 봤습니다..

WITH AA AS(
            SELECT A.NULL_CT
                 , DECODE(B.NULL_CT,NULL,A.NULL_CT,NULL) CT
            FROM (
                  SELECT ROWNUM NULL_CT
                  FROM DUAL
                  CONNECT BY ROWNUM <= 202
                  ) A
                  ,(
                  SELECT round(dbms_random.value(1, 202)) NULL_CT
                  FROM DUAL
                  CONNECT BY ROWNUM <= 10
                  ) B
            WHERE A.NULL_CT = B.NULL_CT(+)
            ORDER BY A.NULL_CT
)
,BB AS(
      SELECT ROWNUM RN
           , NVL(LAG(NULL_CT) OVER(ORDER BY ROWNUM),1) F_CNT
           , NULL_CT E_CNT
      FROM AA
      WHERE CT IS NULL
)
SELECT CT
     , DECODE(CT,NULL,NULL,RANK() OVER(PARTITION BY GP ORDER BY CT)) NEW_CT
FROM (
      SELECT DISTINCT AA.CT
           , CASE WHEN AA.NULL_CT > (SELECT MAX(E_CNT) FROM BB) THEN 9999999
                  WHEN AA.NULL_CT >= BB.F_CNT AND AA.NULL_CT <= BB.E_CNT THEN BB.RN
             END AS GP
      FROM AA
         , BB
      ) A1
WHERE A1.GP IS NOT NULL
;

by 오라클초보 [2015.03.13 13:44:07]

해결하셨다니 잘됬네요..^^

해결 방법 좀 부탁드립니다..^^


by 창조의날개 [2015.03.18 14:50:43]
WITH AA AS(
            SELECT A.NULL_CT
                 , DECODE(B.NULL_CT,NULL,A.NULL_CT,NULL) CT
            FROM (
                  SELECT ROWNUM NULL_CT
                  FROM DUAL
                  CONNECT BY ROWNUM <= 20
                  ) A
                  ,(
                  SELECT round(dbms_random.value(1, 20)) NULL_CT
                  FROM DUAL
                  CONNECT BY ROWNUM <= 2
                  ) B
            WHERE A.NULL_CT = B.NULL_CT(+)
            ORDER BY A.NULL_CT
)
SELECT CT
     , NVL2(CT, ROW_NUMBER() OVER(PARTITION BY GRP ORDER BY NULL_CT), NULL) rn
FROM (
      SELECT NULL_CT
           , CT
           , NVL2(CT, SUM(DECODE(CT,NULL,1,0)) OVER(ORDER BY NULL_CT), NULL) GRP
      FROM AA
      )
ORDER BY NULL_CT
;

 

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