row_number 정렬 질문 0 2 3,921

by pranludi [SQL Query] row_number 그룹 묶음 [2012.07.19 16:42:57]


with t as (
select 1 as user_no, to_date('20120719 183000', 'YYYYMMDD HH24MISS') as rdate, 'A' as gcode from dual
union all select 2, to_date('20120719 183000', 'YYYYMMDD HH24MISS'), 'A' from dual
union all select 3, to_date('20120719 183000', 'YYYYMMDD HH24MISS'), 'A' from dual
union all select 4, to_date('20120719 183000', 'YYYYMMDD HH24MISS'), 'B' from dual
union all select 5, to_date('20120719 193000', 'YYYYMMDD HH24MISS'), 'B' from dual
union all select 6, to_date('20120719 200000', 'YYYYMMDD HH24MISS'), 'C' from dual
union all select 7, to_date('20120719 193000', 'YYYYMMDD HH24MISS'), 'B' from dual
union all select 8, to_date('20120719 200000', 'YYYYMMDD HH24MISS'), 'C' from dual
union all select 9, to_date('20120719 210000', 'YYYYMMDD HH24MISS'), 'C' from dual
union all select 10, to_date('20120719 223000', 'YYYYMMDD HH24MISS'), 'D' from dual
union all select 11, to_date('20120719 223000', 'YYYYMMDD HH24MISS'), 'D' from dual
union all select 12, to_date('20120719 233000', 'YYYYMMDD HH24MISS'), 'D' from dual
union all select 13, to_date('20120719 223000', 'YYYYMMDD HH24MISS'), 'A' from dual
union all select 14, to_date('20120719 183000', 'YYYYMMDD HH24MISS'), 'A' from dual
union all select 15, to_date('20120719 183000', 'YYYYMMDD HH24MISS'), 'B' from dual
)
select ROW_NUMBER() OVER(PARTITION BY rdate, gcode ORDER BY rdate ASC ) AS orst, t.* from t;

회원 데이타가 있습니다. 위 쿼리는 샘플로 만든겁니다.
회원 등록 시간과 등록 그룹별로 묶고 싶습니다.
원하는 형태는 ( 목표 데이타 순서 )

1 / 2012-07-19 오후 6:30:00  / A
2 / 2012-07-19 오후 6:30:00  / A
3 / 2012-07-19 오후 6:30:00  / A
4 / 2012-07-19 오후 6:30:00  / A

1 / 2012-07-19 오후 6:30:00  / B
2 / 2012-07-19 오후 6:30:00  / B
3 / 2012-07-19 오후 7:30:00  / B
4 / 2012-07-19 오후 7:30:00  / B

1 / 2012-07-19 오후 8:00:00  / C
2 / 2012-07-19 오후 8:00:00  / C
3 / 2012-07-19 오후 9:00:00  / C

1 / 2012-07-19 오후 10:30:00 / A
1 / 2012-07-19 오후 10:30:00 / D
2 / 2012-07-19 오후 10:30:00 / D
3 / 2012-07-19 오후 11:30:00 / D


이렇게 시간 순서로 그룹별로 묶는겁니다.
B, C, D 그룹을 보면, 가입 시간이 틀려도 그룹이 같으면 한 그룹으로 묶어줘야 하며 -
그룹과 그룹 사이에 다른 그룹이 있으면 표시도 해줘야 합니다.

지금은 row_number 으로 시간 순으로 표시하도록 해놓았습니다.
같은 라인에 있는 그룹( B, C, D )이라도 서로 떨어져서 별개의 그룹으로 표시가 되는데 -
목표 화면처럼 하고 싶습니다.


by 마농 [2012.07.19 18:40:39]
WITH t AS
(
SELECT 1 user_no, TO_DATE('201207191830', 'yyyymmdd hh24mi') rdate, 'A' gcode FROM dual
UNION ALL SELECT  2, TO_DATE('201207191830', 'yyyymmddhh24mi'), 'A' FROM dual
UNION ALL SELECT  3, TO_DATE('201207191830', 'yyyymmddhh24mi'), 'A' FROM dual
UNION ALL SELECT  4, TO_DATE('201207191830', 'yyyymmddhh24mi'), 'B' FROM dual
UNION ALL SELECT  5, TO_DATE('201207191930', 'yyyymmddhh24mi'), 'B' FROM dual
UNION ALL SELECT  6, TO_DATE('201207192000', 'yyyymmddhh24mi'), 'C' FROM dual
UNION ALL SELECT  7, TO_DATE('201207191930', 'yyyymmddhh24mi'), 'B' FROM dual
UNION ALL SELECT  8, TO_DATE('201207192000', 'yyyymmddhh24mi'), 'C' FROM dual
UNION ALL SELECT  9, TO_DATE('201207192100', 'yyyymmddhh24mi'), 'C' FROM dual
UNION ALL SELECT 10, TO_DATE('201207192230', 'yyyymmddhh24mi'), 'D' FROM dual
UNION ALL SELECT 11, TO_DATE('201207192230', 'yyyymmddhh24mi'), 'D' FROM dual
UNION ALL SELECT 12, TO_DATE('201207192330', 'yyyymmddhh24mi'), 'D' FROM dual
UNION ALL SELECT 13, TO_DATE('201207192230', 'yyyymmddhh24mi'), 'A' FROM dual
UNION ALL SELECT 14, TO_DATE('201207191830', 'yyyymmddhh24mi'), 'A' FROM dual
UNION ALL SELECT 15, TO_DATE('201207191830', 'yyyymmddhh24mi'), 'B' FROM dual
)
SELECT user_no, rdate, gcode
     , ROW_NUMBER() OVER(PARTITION BY rn1 - rn2, gcode ORDER BY rdate, user_no) rn
  FROM (SELECT user_no, rdate, gcode
             , ROW_NUMBER() OVER(ORDER BY rdate, gcode, user_no) rn1
             , ROW_NUMBER() OVER(PARTITION BY gcode ORDER BY rdate, user_no) rn2
          FROM t
        )
 ORDER BY rdate, gcode, user_no
;


by pranludi [2012.07.19 22:35:23]

고맙습니다. 저렇게도 할 수 있군요... ( 답변을 보고 한동안 멍하게 있었음 .... )

질문을 올리고, 잔머리로

SELECT ROW_NUMBER() OVER(PARTITION BY rdate, gcode ORDER BY rdate ASC ) AS orst
, case when gcode = LAG( gcode, 1 ) OVER( ORDER BY rdate ASC ) then 1 else 0 end  AS orst2
, g.*
from t g;

방식으로도 해보았습니다.

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