안녕하세요 쿼리질문드립니다 ㅠㅠ 0 13 4,895

by 김전포 [SQL Query] Oracle Query QnA [2017.04.06 11:36:04]


되게 간단한거 같은데 이게 잘 안되네요 ㅠㅠㅠ

20070330  
20070330  
20070330  
20070330 1
20070630  
20070330  
20070330  

특정 로우 밑으로는 특정 값을 뿌려주고싶어요

위에 보시면 20070330으로 쭉 떨어지다가 20070630으로 바뀌잖아요

그밑으로는 쭉 20070630으로 뿌려주고싶은데요 윈도우함수를 써봐도 잘안되네요..

혹시 시간이 남으신다면 도움좀 부탁드립니다 ㅠㅠ

 

by 긍률 [2017.04.06 11:40:50]

orderby 함수를 사용하시면 되지않나요 날짜를 기준으로 order by주시면 될것 같은대 .


by 김전포 [2017.04.06 11:43:15]

댓글달아주셔서 감사합니다

order by 절은 정렬할때만 쓰이는게 아닌가요??

order by 절로 어떻게 비교를해서 바꿀수있는지....ㅠㅠ 아직 초보입니다 ㅠㅠ


by jkson [2017.04.06 12:34:27]

위의 표는 무슨 기준으로 정렬 되었는지, 왜 그렇게 하시려는 건지 적어주시면 좋겠네요.


by 김전포 [2017.04.06 12:53:25]

보힘 가입일,해지일로 생각하시면 될거같습니다

first_value를 사용하여 최초가입일을 가져오고 1로 표시된때 까지 쭉 이어오다가

해지하고 20070630일에 새로 가입을한건데요 (가입일을 직접입력하지않고 )

그 이후에는 쭉 20070630이 표시가 되어야하는데

first_value값이기 때문에 20070330이 계속 표시되고있습니다...

제가 알고싶은건 특정로우 이후에 밑으로 값을 바꿔주는 함수나 방법이 있는지..


by 마농 [2017.04.06 13:05:51]

실제 원본 테이블이 어떤 식으로 저장되어 있는지를 보여 주세요.
원본 대비 결과표를 보여 주세요.


by 긍률 [2017.04.06 13:06:26]

first value 에 최초 가입일 값 200703이 있고 200706 값은 어디에 저장 되는건가요 

 


by 김전포 [2017.04.06 13:17:25]

 

 

 

 

출역년월     출역시작     출역종료

  200603       20060330    20060330

  200604       20060430    20060430

  200605       20060530    20060530

  200607       20060730    20060730

이게 원본데이터구요 제가 뽑으려는 데이터는 보험가입일,해지일 입니다

출역시작한 날짜가 보험 가입일입니다 출역을 해서 연속으로 근무하면 보험이 해지가 되지않는데

한달이라도 건너뛰면 바로 해지되고 그다음 첫 출역일자가 보험 가입일로 되어야 합니다

출역년월       보험가입       보험해지

200603         20060330   

200604         20060330

200605         20060330      20060601

200607         20060730  

200608         20060730

.

.

.    

first_value로 최초 보험일은 가져올수있는데 중간에 끊겼을때 그다음 가입일을 못가져오겠습니다..

너무 길이글고 조잡해서 죄송합니다 ㅠㅠ

 

 

 


by jkson [2017.04.06 14:09:20]
with t as
(
select '200603' yyyymm, '20060330' sdt, '20060330' edt from dual union all
select '200604' yyyymm, '20060430' sdt, '20060430' edt from dual union all
select '200605' yyyymm, '20060530' sdt, '20060530' edt from dual union all
select '200607' yyyymm, '20060730' sdt, '20060730' edt from dual
)
select yyyymm, min(sdt) over(partition by gp order by sdt) dt
  from
    (  
    select yyyymm, sdt, edt
         , sum(decode(premon, thismon,0,1)) over(order by yyyymm) gp 
      from
        (  
        select yyyymm, sdt, edt 
              ,trunc(add_months(to_date(lag(sdt) over (order by sdt),'yyyymmdd'),1),'mm') premon
              ,trunc(to_date(sdt,'yyyymmdd'),'mm') thismon
          from t
        )  
    ) 

 


by 김전포 [2017.04.06 15:37:21]

와...................................감탄을 금치 못하겠네요..................................................

정말 감사합니다 손jk 고수님 고맙습니다!!!!!!!!!!!!!!!!!!!!!!!!!


by 김전포 [2017.04.06 16:58:05]

해결했습니다 정말 감사합니다

어떻게 어떻게 해서 원하는 결과값은 나오긴 했지만

sum(decode(premon, thismon,0,1)) over(order by yyyymm) gp

이부분은 도대체 어떻게 생각하신건지 모르겠어요...

오래되면 이런쿼리가 생각이 나는건가요..?


by jkson [2017.04.06 17:19:45]

마농님께 배웠습니다. 시간 있으실 때 왼쪽 메뉴 oracle database - 퀴즈로 배우는 SQL 문제 풀어보세요.

틀려도 남는 게 있고 맞춰도 다른 더 좋은 방법이 많더군요^^


by 마농 [2017.04.06 23:24:45]
SELECT yyyymm
     , MIN(sdt) OVER(PARTITION BY ADD_MONTHS(TO_DATE(yyyymm, 'yyyymm'), -ROWNUM)) dt
  FROM (SELECT * FROM t ORDER BY yyyymm)
;

 


by jkson [2017.04.07 08:00:57]

거봐요 맞춰도 더 좋은 방법이 있습니다ㅋㅋ

역시 적재적소에 필요한 만큼만..

훨씬 깔끔하네요! 즐건 하루 보내세요^^

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