3

連続していないが順序付けられた数値識別子があります。連続した値を取得したいと思います。

現在のテーブル:

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
4

4 に答える 4

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

于 2012-05-04T01:54:40.397 に答える
2

値を集計し、行番号を使用して目的の値を取得してから、元の値に結合します。

SELECT t.original, sq.desired
FROM Table t
INNER JOIN(
  SELECT ssq.original, @rownum:=@rownum+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
于 2012-05-03T22:01:49.813 に答える
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;
于 2012-05-04T04:09:06.057 に答える
0

私があなたを正しく理解していれば:

select 
    original_value, 
    dense_rank() over (order by original_value) as desired_value
于 2012-05-04T07:02:49.000 に答える