Group by 하기에는 애매한 그룹에서 일부 데이타만 추출하고 싶습니다 0 4 991

by SQL초보 [SQL Query] [2017.01.16 21:37:31]


안녕하세요~ 질문드립니다

아래와 같이 CHG_STAT 테이블의 조회결과 데이타가 있습니다

SELECT * FROM chg_stat

WHERE p_no = '75421658';

CHG_STAT
seq_no p_no chg_dt sts
151 75421658 20160501 20
155 75421658 20160524 10
162 75421658 20160601 10
171 75421658 20160615 10
236 75421658 20160801 42
240 75421658 20160915 10
257 75421658 20161001 10

 

위의 데이타는 p_no = '75421658' 의 상태값(sts) 이 변경된 이력입니다

여기서 노란색 값들은 상태가 변하지 않았는데 Insert된 잘못된 값입니다;

(상태가 최초로 변한 값은 필요합니다 ex> seq_no 가 '155', '240')

 

여기서 노란색 값을 제외하여 아래 표처럼 조회되게 가능한 SQL 해법이 있는지

조언 부탁드립니다!! 감사합니다.

CHG_STAT
seq_no p_no chg_dt sts
151 75421658 20160501 20
155 75421658 20160524 10
236 75421658 20160801 42
240 75421658 20160915 10
by jkson [2017.01.16 23:00:26]
with t as
(
select 151 seq_no, '75421658' p_no, '20160501' chg_dt, '20' sts from dual union all 
select 155 seq_no, '75421658' p_no, '20160524' chg_dt, '10' sts from dual union all 
select 162 seq_no, '75421658' p_no, '20160601' chg_dt, '10' sts from dual union all 
select 171 seq_no, '75421658' p_no, '20160615' chg_dt, '10' sts from dual union all 
select 236 seq_no, '75421658' p_no, '20160801' chg_dt, '42' sts from dual union all 
select 240 seq_no, '75421658' p_no, '20160915' chg_dt, '10' sts from dual union all 
select 257 seq_no, '75421658' p_no, '20161001' chg_dt, '10' sts from dual
)
select seq_no, p_no, chg_dt, sts
  from
  (
  select seq_no, p_no, chg_dt, sts
       , row_number() over(partition by p_no, sts, rn2 - rn1 order by seq_no) rn
    from 
    (
    select seq_no, p_no, chg_dt, sts, row_number() over(partition by p_no, sts order by seq_no) rn1
         , row_number() over (order by seq_no) rn2
      from t
    )
  )
 where rn = 1
 order by seq_no

 


by 손님 [2017.01.17 10:01:29]
감사합니다^^ 많은도움되었어요!

by 마농 [2017.01.17 14:36:36]
SELECT seq_no, p_no, chg_dt, sts
  FROM (SELECT seq_no, p_no, chg_dt, sts
             , DECODE(
               LAG(sts) OVER(PARTITION BY p_no ORDER BY seq_no)
               , sts, 0, 1) flag
          FROM t
        )
 WHERE flag = 1
;

 


by jkson [2017.01.17 16:10:21]

아하하하하하하하 한잔하고 댓글 달았더니 너무 어렵게 생각했네요ㅋㅋ

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