13

2列のテーブルがあります。

+------+------+
| data | num  | 
+------+------+
| a    |      | 
| a    |      |
| a    |      |
| b    |      |
| b    |      |
| c    |      |
| d    |      |
| a    |      |
| b    |      | 
+------+------+

列「num」に、重複する各エントリの増分カウンターが表示されるようにします。

+------+------+
| data | num  | 
+------+------+
| a    |    1 | 
| a    |    2 |
| a    |    3 |
| b    |    1 |
| b    |    2 |
| c    |    1 |
| d    |    1 |
| a    |    4 |
| b    |    3 | 
+------+------+

これは、mySQL クエリ以外のスクリプトなしで実行できますか?

アップデート:

ここで拡張質問

4

4 に答える 4

14

残念ながら、MySQLには必要なウィンドウ関数がありません。したがって、次のようなものを使用する必要があります。

最終クエリ

select data, group_row_number, overall_row_num
from
(
  select data,
        @num := if(@data = `data`, @num + 1, 1) as group_row_number,
        @data := `data` as dummy, overall_row_num
  from
  (
    select data, @rn:=@rn+1 overall_row_num
    from yourtable, (SELECT @rn:=0) r
  ) x
  order by data, overall_row_num
) x
order by overall_row_num

SQL FiddlewithDemoを参照してください

説明:

まず、内部選択。これrow_numberにより、テーブル内のすべてのレコードにモックが適用されます(SQL Fiddle with Demoを参照)。

select data, @rn:=@rn+1 overall_row_num
from yourtable, (SELECT @rn:=0) r

クエリの2番目の部分では、テーブル内の各行を次の行と比較して、同じ値であるかどうかを確認します。同じ値でない場合は、最初からgroup_row_numberやり直します(SQL Fiddle with Demoを参照)。

select data,
      @num := if(@data = `data`, @num + 1, 1) as group_row_number,
      @data := `data` as dummy, overall_row_num
from
(
  select data, @rn:=@rn+1 overall_row_num
  from yourtable, (SELECT @rn:=0) r
) x
order by data, overall_row_num

最後の選択は、必要な値を返し、要求した順序に戻します。

select data, group_row_number, overall_row_num
from
(
  select data,
        @num := if(@data = `data`, @num + 1, 1) as group_row_number,
        @data := `data` as dummy, overall_row_num
  from
  (
    select data, @rn:=@rn+1 overall_row_num
    from yourtable, (SELECT @rn:=0) r
  ) x
  order by data, overall_row_num
) x
order by overall_row_num
于 2012-09-17T17:08:56.877 に答える
4

これは、あなたが望むことをする簡単なクエリです。

select id,data,rownum 
  from (
          select id,
                 data,
                 @row:=if(@prev=data,@row,0) + 1 as rownum,
                 @prev:=data 
            from tbl
        order by data,id
)t

各行にIDを含めました。しかし、あなたはそれを必要としません。

フィドルに行く: http://sqlfiddle.com/#!2/1d1f3/11/0

クレジット: MY SQL の列のグループに行番号が必要ですか?

于 2012-09-17T17:21:31.903 に答える
0

データは表示されている順序のままにする必要がありますか、それとも「データ」値で並べ替えることができますか?

並べ替えることができる場合は、現在の「データ」値を追跡するだけで済みます。これは、変数を使用して実行できます。

set @last_data = null;
set @count = 0;
select data, @count,
  case when @last_data is null or data != @last_data then @count := 1 else @count := @count + 1 end as new_count,
  @last_data := data, @count
from t20120917
order by data;

そうでなければ、もっと複雑になると思います...

于 2012-09-17T17:08:20.223 に答える
0

このようなものですが、手順を作成する必要があります

create procedure procname()
begin
DECLARE done,i,j int DEFAULT 0;
DECLARE n,m nvarchar(500) DEFAULT '';

DECLARE cur CURSOR FOR SELECT d.data,d.num FROM tablename AS d ORDER BY DATA;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;


OPEN cur;

read_loop: LOOP

set m = n;
SET j = i;
fetch cur into n,i;

IF n = m 
THEN
SET i = i+1;
// UPDATE here your TABLE but you will need one more colomn to be able to UPDATE ONLY one RAW that you need
ELSE 
SET i = 0; //RESET indexer 
END IF;

IF done = 1 THEN
LEAVE read_loop;
END IF;

END LOOP read_loop;

CLOSE cur;
end
于 2012-09-17T17:12:14.603 に答える