2014-12-03 3 views
0

여러 부서가있는 회사가 있다고 가정합니다. 각 전화 번호에는 하나 또는 몇 개의 내부 전화 번호 범위가 할당되어 있습니다. 할당은 다음과 같이, 하나 개의 데이터베이스 테이블에 저장하지만, 다른 부서에 대해 서로 다른 방식으로되어 결합으로MySQL에서 서로 다른 행의 인접한 범위 합치는

dept_name range_start range_end 

Sales  10    19 
Sales  20    29 
HR   30    49 
Finance  60    65 
Finance  84    93 

방법은 인접한 범위가되도록 판매 부서에 대해 선택할 수 있습니다. 다음과 같이 결과에 행이 하나만 있습니다.

dept_name range_start range_end 

Sales  10    29 
HR   30    49 
Finance  60    65 
Finance  84    93 

?

+0

연속되는 경우 데이터의 범위가 서로 다른 이유는 무엇입니까? –

+0

@MikeBrant 하나님이 알고 있습니다. 누군가의 유산. –

+0

그것은 단지 데이터베이스의 행입니다. 왜 그 행을 결합하여 수정하지 않습니까? –

답변

1

모든 범위 시작을 찾아서 모든 범위 끝을 찾은 다음 올바른 순서로 함께 결합하면됩니다. 여기

이 개념을 보여줍니다 SQLfiddle입니다 : http://sqlfiddle.com/#!2/6cd35/24

그리고 쿼리를 ...

SELECT oStart.dept_name, oStart.range_start, oEnd.range_end 
FROM 
(
    SELECT strt.dept_name, strt.range_start, @rownum := @rownum + 1 AS rank 
    FROM 
     (
     SELECT d1.dept_name, d1.range_start, d1.range_end 
     FROM DepartmentPhoneRanges AS d1 
     LEFT JOIN DepartmentPhoneRanges AS d2 
      ON d1.dept_name = d2.dept_name AND d1.range_start = d2.range_end + 1 
     WHERE d2.dept_name IS NULL 
    ) AS strt 
     , 
     (SELECT @rownum := 0) r 
    ORDER BY dept_name, range_start 
) AS oStart 
INNER JOIN (
    SELECT end.dept_name, end.range_end, @rownum2 := @rownum2 + 1 AS rank2 
    FROM 
     (
     SELECT d1.dept_name, d1.range_start, d1.range_end 
     FROM DepartmentPhoneRanges AS d1 
     LEFT JOIN DepartmentPhoneRanges AS d2 
      ON d1.dept_name = d2.dept_name AND d1.range_end = d2.range_start - 1 
     WHERE d2.dept_name IS NULL 
    ) AS end 
     , 
     (SELECT @rownum2 := 0) r 
    ORDER BY dept_name, range_end 
) AS oEnd 
ON oStart.dept_name = oEnd.dept_name AND oStart.rank = oEnd.rank2 
; 

NB - (SQL 서버에 존재하므로) MySQL의에서 어떤 ROW_NUMBER() 함수와 내가 사용 그 속임수는 OMG Ponies '답변에서 this post 스탠드 인으로

관련 문제