[SQL] 오라클 SQL은 - 연속 값 범위를 확인
SQL오라클 SQL은 - 연속 값 범위를 확인
여기 내 테이블은 다음과 같습니다
ID Name Department
1 Michael Marketing
2 Alex Marketing
3 Tom Marketing
4 John Sales
5 Brad Marketing
6 Leo Marketing
7 Kevin Production
나는 ID 범위를 찾기 위해 노력하고 어디학과 = '마케팅'
Range From To
Range1 1 3
Range2 5 6
어떤 도움을 주시면 감사하겠습니다.
해결법
-
==============================
1.이 Tabibitosan이라는 기술을 쉽게 수행 할 수 있습니다.
이 Tabibitosan이라는 기술을 쉽게 수행 할 수 있습니다.
어떤이 기술하는 일은 같은 그룹에있는 행이 서로 여부를 옆 경우 해결하기 위해, 행의 전체 세트에 각 그룹의 행의 위치를 비교합니다.
예를 들어, 귀하의 예제 데이터와이 보이는 같은 :
WITH your_table AS (SELECT 1 ID, 'Michael' NAME, 'Marketing' department FROM dual UNION ALL SELECT 2 ID, 'Alex' NAME, 'Marketing' department FROM dual UNION ALL SELECT 3 ID, 'Tom' NAME, 'Marketing' department FROM dual UNION ALL SELECT 4 ID, 'John' NAME, 'Sales' department FROM dual UNION ALL SELECT 5 ID, 'Brad' NAME, 'Marketing' department FROM dual UNION ALL SELECT 6 ID, 'Leo' NAME, 'Marketing' department FROM dual UNION ALL SELECT 7 ID, 'Kevin' NAME, 'Production' department FROM dual) -- end of mimicking your table with data in it. See the SQL below: SELECT ID, NAME, department, row_number() OVER (ORDER BY ID) overall_rn, row_number() OVER (PARTITION BY department ORDER BY ID) department_rn, row_number() OVER (ORDER BY ID) - row_number() OVER (PARTITION BY department ORDER BY ID) grp FROM your_table; ID NAME DEPARTMENT OVERALL_RN DEPARTMENT_RN GRP ---------- ------- ---------- ---------- ------------- ---------- 1 Michael Marketing 1 1 0 2 Alex Marketing 2 2 0 3 Tom Marketing 3 3 0 4 John Sales 4 1 3 5 Brad Marketing 5 4 1 6 Leo Marketing 6 5 1 7 Kevin Production 7 1 6
여기서, I는 데이터 ID 순서합니다 (overall_rn 열) 상승의 행 번호의 집합 전체에 걸쳐 모든 행을 부여했으며, I 오름차순 다시 각 부서의 행을 행 수 (department_rn 열), 준 ID 순서.
지금은 그 일을 한 것을, 우리는 다른 하나 (접지면 열을) 뺄 수 있습니다.
그룹 칼럼의 숫자가 서로 옆에 부서 행에 대해 동일하게 유지하지만 간격이있을 때마다 변경하는 방법을 알 수 있습니다.
예를 들면 마케팅 부서, 행 1-3 서로 옆에 있고 GRP = 0을 가지고 있지만 지금 다른 GRP 번호를 가지고 있으므로 4 마케팅 행 설정 전체 결과의 5 행에 실제로있다. 5 마케팅 행이 전체 세트의 6 행에 있기 때문에 우리가 서로 옆에있어 알 수 있도록, 그것은, 4 마케팅 행과 같은 GRP 번호가 있습니다.
우리가 GRP 정보가 후에는, 부서 및 우리의 새로운 GRP 열 모두 그룹화 집계 쿼리를하고 시작과 끝 ID를 찾기 위해 최소 및 최대를 사용하는 간단한 문제입니다 :
WITH your_table AS (SELECT 1 ID, 'Michael' NAME, 'Marketing' department FROM dual UNION ALL SELECT 2 ID, 'Alex' NAME, 'Marketing' department FROM dual UNION ALL SELECT 3 ID, 'Tom' NAME, 'Marketing' department FROM dual UNION ALL SELECT 4 ID, 'John' NAME, 'Sales' department FROM dual UNION ALL SELECT 5 ID, 'Brad' NAME, 'Marketing' department FROM dual UNION ALL SELECT 6 ID, 'Leo' NAME, 'Marketing' department FROM dual UNION ALL SELECT 7 ID, 'Kevin' NAME, 'Production' department FROM dual) -- end of mimicking your table with data in it. See the SQL below: SELECT department, MIN(ID) start_id, MAX(ID) end_id FROM (SELECT ID, NAME, department, row_number() OVER (ORDER BY ID) - row_number() OVER (PARTITION BY department ORDER BY ID) grp FROM your_table) GROUP BY department, grp; DEPARTMENT START_ID END_ID ---------- ---------- ---------- Marketing 1 3 Marketing 5 6 Sales 4 4 Production 7 7
NB, 나는 레오와 케빈의 ID를했다, 그래서 = 6 (7 각각 8), 다음 레오와 브래드 여전히 같은에 나타나는 ID에 대한 행이 없었다 경우 ID 열의 간격이 (중요 즉 아니라는 것을 가정 한 기, 시작 ID = 5 및 종료 ID = 7.
아이디 열 격차가 새 그룹을 나타내는으로 계산하면, 당신은 행의 전체 세트 레이블 ID를 사용할 수 있습니다합니다 (overall_rn을 caluclate하는 즉 필요 없음, 그냥 대신 id 컬럼을 사용).
즉 쿼리가 될 것입니다 의미 :
WITH your_table AS (SELECT 1 ID, 'Michael' NAME, 'Marketing' department FROM dual UNION ALL SELECT 2 ID, 'Alex' NAME, 'Marketing' department FROM dual UNION ALL SELECT 3 ID, 'Tom' NAME, 'Marketing' department FROM dual UNION ALL SELECT 4 ID, 'John' NAME, 'Sales' department FROM dual UNION ALL SELECT 5 ID, 'Brad' NAME, 'Marketing' department FROM dual UNION ALL SELECT 7 ID, 'Leo' NAME, 'Marketing' department FROM dual UNION ALL SELECT 8 ID, 'Kevin' NAME, 'Production' department FROM dual) -- end of mimicking your table with data in it. See the SQL below: SELECT department, MIN(ID) start_id, MAX(ID) end_id FROM (SELECT ID, NAME, department, ID - row_number() OVER (PARTITION BY department ORDER BY ID) grp FROM your_table) GROUP BY department, grp; DEPARTMENT START_ID END_ID ---------- ---------- ---------- Marketing 1 3 Sales 4 4 Marketing 5 5 Marketing 7 7 Production 8 8
-
==============================
2.나는 현재 환경이없는하지만 당신은 이런 식으로 뭔가를 시도 할 수 있습니다
나는 현재 환경이없는하지만 당신은 이런 식으로 뭔가를 시도 할 수 있습니다
select * from tab1 where id in (select min(id) from tab1 where Department = 'Marketing' union select max(id) from tab1 where Department = 'Marketing')
from https://stackoverflow.com/questions/48209986/oracle-sql-identify-sequential-value-ranges by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 이미 생성 된 테이블에 오라클에서 자동 증가 (0) | 2020.05.06 |
---|---|
[SQL] 어떻게 MySQL의 날짜 격차를 채우기 위해? (0) | 2020.05.05 |
[SQL] 어떤 방법은 전체 텍스트와 같은 이노에 검색을 달성하기 위해 (0) | 2020.05.05 |
[SQL] MySQL의 피벗 테이블의 열 데이터 행으로 (0) | 2020.05.05 |
[SQL] 어떻게 오라클에서 일정 테이블을 채우는? (0) | 2020.05.05 |