연속된 숫자를 그룹핑하는 방법좀 알려주세요.. 0 3 1,619

by 임상수 [SQL Query] sql group by [2017.11.16 20:12:22]


안녕하세요. 쿼리 질문좀 드릴께요.

number
1
2
3
4
5
6
7
8
9
10
13
14
11
12
15
16
17
18
19
20

 

위와 같이 1~20 까지의 숫자가 나열되어 있을 때,

연속된 숫자끼리는 그룹을 지으려 합니다.

예를 들면 1~10, 그다음에는 13~14, 11~12, 15~20이 같은 그룹이 되는거죠..

 

최소값 최대값 그룹
1 10 1-10
11 12 11-12
13 14 13-14
15 20 15-20

 

고민을 하다가 해결이 잘 안돼서 질문 올립니다.

감사합니다.

by jkson [2017.11.17 07:31:00]

데이터가 그냥 저렇게 나열되어 있지는 않을 것 같고

sort 기준 컬럼이 있을 것 같은데요.

with t as
(
select 1	sort, 1  num from dual union all 
select 2	sort, 2  num from dual union all
select 3	sort, 3  num from dual union all
select 4	sort, 4  num from dual union all
select 5	sort, 5  num from dual union all
select 6	sort, 6  num from dual union all
select 7	sort, 7  num from dual union all
select 8	sort, 8  num from dual union all
select 9	sort, 9  num from dual union all
select 10	sort, 10 num from dual union all 
select 11	sort, 13 num from dual union all 
select 12	sort, 14 num from dual union all 
select 13	sort, 11 num from dual union all 
select 14	sort, 12 num from dual union all 
select 15	sort, 15 num from dual union all 
select 16	sort, 16 num from dual union all 
select 17	sort, 17 num from dual union all 
select 18	sort, 18 num from dual union all 
select 19	sort, 19 num from dual union all 
select 20	sort, 20 num from dual
)
select to_char(min(num))||'-'||to_char(max(num)) gp, min(num) minnum, max(num) maxnum
  from
  (
    select sort, num, sum(fg) over(order by sort) gp
      from
      (
      select sort, num, decode(num - lag(num) over (order by sort),1,0,1) fg
        from t
    )
  )
 group by gp
 order by 1

 


by 임상수 [2017.11.17 10:42:25]

감사합니다. 덕분에 잘 해결됐습니다.


by 고수가되고싶어요 [2017.12.06 13:46:48]
WITH t AS(
SELECT LEVEL lv FROM dual CONNECT BY level <=10
UNION ALL SELECT 13 FROM dual 
UNION ALL SELECT 14 FROM dual 
UNION ALL SELECT 11 FROM dual 
UNION ALL SELECT 12 FROM dual 
UNION ALL SELECT 15 FROM dual 
UNION ALL SELECT 16 FROM dual 
UNION ALL SELECT 17 FROM dual 
UNION ALL SELECT 18 FROM dual 
UNION ALL SELECT 19 FROM dual 
UNION ALL SELECT 20 FROM dual 
)
select MIN(lv) 최소값
	  ,MAX(lv) 최대값
      ,MIN(lv)||'~'||MAX(lv) 그룹
FROM (
SELECT lv
	  ,gb1
      ,SUM(gb1) OVER(ORDER BY lv) gb2
FROM (
SELECT lv
	  ,CASE WHEN (lv-LAG(lv) OVER(ORDER BY null) ) = 1 THEN 0 ELSE 1 END gb1 
FROM t )	)
GROUP BY gb2
ORDER BY 1

--결과 데이터 

1    10    1~10
11    12    11~12
13    14    13~14
15    20    15~20

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