1

次のデータがあります。

type   id    date1   date2   diff
-----------------------------------    
blue   1      x1     xxx      18
blue   1      x2     -         -
red    1      x1     -         -
blue   2      x1     xx       15
blue   2      x2     xx       18
blue   2      x3     -        -

そして、次のようなデータを取得するために a を追加したいと思いrow_numberます:

type   id    date1   date2   diff  row_number
---------------------------------------------
blue   1      x1     xxx      18      1
blue   1      x2     -         -      2
red    1      x1     -         -      1
blue   2      x1     xx       15      1
blue   2      x2     xx       18      2
blue   2      x3     -        -       3

つまり、最初にタイプで並べ替え、次に ID と最後の日付で並べ替えます。

次の構文を試しました。

Create table t(type char(7), id int(13), date1 date, date2 date, diff int, row_number int) ;

Insert into t(type, id, date1, date2, diff, row_number)

   (SELECT a.type, a.id, a.date1, a.date2, a.diff
    FROM 
       (Select 
            type, id, date1, date2, diff, row_number() over (order by type, id, date1) as r 
        from table) a 
    order by 
       a.type, a.id, a.date1;

上記の構文は機能せず、次のエラー メッセージが表示されます。

SQL 構文にエラーがあります。MYSQL バージョンに対応するマニュアルを確認してください。

コマンドが次のように機能するかどうかを確認するためだけに、より簡単な構文を試しました。

SELECT 
   type,    
   ROW_NUMBER() OVER (PARTITION BY type, id, date1 ORDER By type, lpnr, date1) as t,
   id,
   date1
FROM table;

また

select 
    row_number() over(order by id), 
    id
from table;

それでも同じエラーメッセージが表示されます。

私が間違っていること、またはrow_numberがMYSQLバージョンで機能しない場合(私はheidiとworkbenchを持っています)教えてください。コマンドが機能しない場合、私がやりたいことを行う他の方法はありますか?

手伝ってくれてどうもありがとう!

リンダ

4

1 に答える 1

3

残念ながら、MySQL があなたが使用しようとしている分析関数を提供するとは思えませんROWNUMBER() OVER PARTITION

ただし、それは他の手段を使用して導出できないという意味ではありません。これを試してください:

create table myTable (type varchar(50) not null,id int(10) unsigned not null,
date1 varchar(10) default null,date2 varchar(10) default null,diff int unsigned default null
);

insert into myTable (type,id,date1,date2,diff) values ('blue',1,'x1','xxx',18);
insert into myTable (type,id,date1,date2,diff) values ('blue',1,'x2',null,null);
insert into myTable (type,id,date1,date2,diff) values ('red',1,'x1',null,null);
insert into myTable (type,id,date1,date2,diff) values ('blue',2,'x1','xx',15);
insert into myTable (type,id,date1,date2,diff) values ('blue',2,'x2','xx',18);
insert into myTable (type,id,date1,date2,diff) values ('blue',2,'x3',null,null);

select t.type,t.id,t.date1,t.date2,t.rownum
from
(
select mt.type,mt.id,mt.date1,mt.date2,mt.diff,
case 
when mt.id = @curId and mt.type = @curType then @curRow := @curRow + 1 
     else @curRow := 1
END as rownum,
@curId := mt.id,
@curType := mt.type
from myTable mt
join (select @curRow := 0, @curId := -1,@curType="") r
order by mt.id,mt.type
) t;
于 2013-02-21T10:04:12.170 に答える