쿼리 질문 드립니다. 0 3 1,268

by Philip [2015.06.10 15:49:30]


/*

 * 데이터값

 */

col1     col2     col3     reg_dt

========================

A1     B1     C1     2015/01/01

A1     B1     C1     2015/01/02

A1     B2     C1     2015/01/03

A1     B1     C2     2015/01/04

A1     B1     C1     2015/01/05

A1     B1     C1     2015/01/06

 

/*

 * 원하는값

 */

col1     col2     col3     reg_dt     group_id

========================

A1     B1     C1     2015/01/01     1

A1     B1     C1     2015/01/02     1

A1     B2     C1     2015/01/03     2

A1     B1     C2     2015/01/04     3

A1     B1     C1     2015/01/05     4

A1     B1     C1     2015/01/06     4

 

정렬은 데이터값 발생 순으로 정렬하고

GROUP_ID는 이전값이 변경되는 GROUP_ID가 증가하도록 쿼리를 작성하고 싶습니다.

 

by jkson [2015.06.10 16:18:12]

정렬이 데이터값 발생순이라는 말씀은 REG_DT 말씀하시는 건가요?

그런데 REG_DT는 날짜까지만 있고 시간이 없어서 약간 모호한 것 같은데요.. 일단

REG_DT가 동일할 때는 ROWNUM으로 정렬한다고 가정하고 작성해보면..

WITH T AS
(
SELECT 'A1' COL1, 'B1' COL2, 'C1' COL3, '2015/01/01' REG_DT FROM DUAL UNION ALL
SELECT 'A1' COL1, 'B1' COL2, 'C1' COL3, '2015/01/02' REG_DT FROM DUAL UNION ALL
SELECT 'A1' COL1, 'B2' COL2, 'C1' COL3, '2015/01/03' REG_DT FROM DUAL UNION ALL
SELECT 'A1' COL1, 'B1' COL2, 'C2' COL3, '2015/01/04' REG_DT FROM DUAL UNION ALL
SELECT 'A1' COL1, 'B1' COL2, 'C1' COL3, '2015/01/05' REG_DT FROM DUAL UNION ALL
SELECT 'A1' COL1, 'B1' COL2, 'C1' COL3, '2015/01/06' REG_DT FROM DUAL
)
SELECT COL1, COL2, COL3, REG_DT, SUM(GRP) OVER(ORDER BY RN)
FROM
(
SELECT T.*, DECODE(COL1||COL2||COL3
                  ,LAG(COL1||COL2||COL3) OVER (ORDER BY REG_DT, ROWNUM),0,1) GRP
     , ROW_NUMBER() OVER(ORDER BY REG_DT, ROWNUM) RN
FROM T
)
ORDER BY RN

 


by 겸댕2후니 [2015.06.10 16:59:56]

궁금한 점이 있어 문의드립니다.

분석함수에 대해 아직 자세하게 알지 못해서 질문드립니다.

위와 같이 분석함수 사용시, 분석함수의 order by 절에 의해서 결과set의 정렬이 일어나는 것 같은데,

아래의 두 컬럼에서 order by 절에 해당하는 컬럼이 서로 다를 경우에는 어떤 컬럼에 의해

결과 row가 정렬되는지 알려 주시면 감사하겠습니다.

,LAG(COL1||COL2||COL3) OVER (ORDER BY REG_DT, ROWNUM),0,1) GRP
, ROW_NUMBER() OVER(ORDER BY reg_dt) RN


by jkson [2015.06.10 17:14:39]

lag함수와 row_number함수 order by 절이 다르면 어느 것 기준으로 결과가 나오냐는 말씀이신가요?

최종적으로는 rn 값으로 정렬하게 되므로 row_number에 있는 order by 절 기준으로 정렬이 되겠죠.

다만 최종 결과셋 정렬이 그렇다는 것이고 group_id를 만들어주는 lag함수의 order by 절에는 rownum이 있으므로 group_id에는 영향이 없고 정렬 순서가 틀어지면서 group_id가 순차적으로 증가하지 않을 수는 있겠죠.

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