2012-05-03 5 views
3

비 연속이지만 숫자로 구분 된 식별자가 있습니다. 나는 연속적인 가치를 얻고 싶다.SQL : 연속되지 않는 값을 연속적인 값으로 대체하십시오.

현재 테이블 :

original_value 

1 
1 
1 
3 
3 
29 
29 
29 
29 
1203 
1203 
5230304 
5230304 
5230304 
5230304 

원하는 테이블 :

original_value desired_value 

1    1 
1    1 
1    1 
3    2 
3    2 
29    3 
29    3 
29    3 
29    3 
1203    4 
1203    4 
5230304   5 
5230304   5 
5230304   5 
5230304   5 
+1

연속 값을 보여주는 쿼리를 원하거나 현재 값을 연속 값으로 업데이트 하시겠습니까? – Bohemian

답변

3

다른 접근 방식은 다음과 같습니다.

select 

    original_value, 
    case when @original = original_value then 
    @group_number 
    else 
    @group_number := @group_number + 1 
    end, 
    (@original := original_value) as x 

from tbl,(select @original := null, @group_number := 0) z 
order by original_value 

라이브 테스트 : http://www.sqlfiddle.com/#!2/b82d6/6

당신이 결과에서 계산을 제거 할 경우 쿼리 테이블 - 파생 :

select w.original_value, w.group_number 
from 
(
    select 

    original_value, 
    case when @original = original_value then 
     @group_number 
    else 
     @group_number := @group_number + 1  
    end as group_number, 
    (@original := original_value) as x 

    from tbl,(select @original := null, @group_number := 0) z 
    order by original_value 
) w 

라이브 테스트 : http://www.sqlfiddle.com/#!2/b82d6/4

2

집계 당신의 가치, 사용의 행 번호를 원래 값으로 다시 가입 한 후, 원하는 값을 얻을 :

SELECT t.original, sq.desired 
FROM Table t 
INNER JOIN(
    SELECT ssq.original, @rownum:[email protected]+1 ‘desired’ 
    FROM (
    SELECT t.original 
    FROM Table t 
    GROUP BY t.original 
    ORDER BY t.original 
) ssq, 
    (SELECT @rownum:=0) r 
) sq ON sq.original = t.original 
1

또 다른 접근 방식이 하나의 시뮬레이션을 DENSE_RANK (조인 포함) :

SELECT t.original, d.derived 
     FROM t 
INNER JOIN ( SELECT t.original, COUNT(DISTINCT t1.original) AS "derived" 
        FROM t 
      INNER JOIN t t1 
         ON t.original >= t1.original 
       GROUP BY 1) d 
      ON t.original = d.original 
    ORDER BY t.original; 
+0

처음부터 re-'COUNT'가 나쁜 이유는이 게시물을 참조하십시오 http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/running-sums-redux.aspx –

+0

@MichaelBuen, 예,이 대답은 정확하고 효율적이지 않고 올바른 것입니다. :) – pilcrow

+0

프로덕션에서 사용하게 될 답변을 제안 하시겠습니까? 그렇지? ;-) –

0

올바르게 이해하면 :

select 
    original_value, 
    dense_rank() over (order by original_value) as desired_value 
+0

가장 좋은 기술은 +1이지만, MySQL은 이것을 지원하지 않으므로 -1입니다. :) – pilcrow

관련 문제