2016-05-15 7 views
0

テーブル「starting_pitcher_stats」にRow_Number列を作成するためにMySQLコードを決定するのに苦労しています私は1からスタートしたいと思っていますが、新しい年の初めに1から、そして新しい投手がいるときには1から再開したいと思っています。私はROW_NUMBER列を作成するには、次のコードを使用:新年の初めに1から再開する「行番号」列を作成しようとしています。新しい表記ピッチャーがあるとき

を理想的には、表は次のようになります。

Starting_Pitcher park_factor std_PF Row_Number Game_Date Game_Number 
    aased001   108   108  1   1977-07-26  0 
    aased001   94   101  2   1977-07-31  0 
    aased001   100   100.66 3   1977-08-06  0 
    aased001   108   102.5 4   1977-08-11  0 
    aased001   108   103.66 5   1977-08-16  0 
    aased001   96   102.33 6   1977-08-21  0 
    aased001   108   103.14 7   1977-08-26  0 
    aased001   108   103.75 8   1977-08-31  0 
    aased001   104   103.77 9   1977-09-05  1 
    aased001   108   104.2 10   1977-09-10  0 
    aased001   92   103.09 11   1977-09-16  0 
    aased001   106   103.33 12   1977-09-22  0 
    aased001   108   103.69 13   1977-09-27  1 
    aased001   96   96  1   1978-04-11  0 
    aased001   100   13.06 2   1978-04-16  0 
    aased001   100   18.5 3   1978-04-21  0 
    aased001   96   23.05 4   1978-04-28  0 

...それが今であるため、表のサンプルは次のようになります。

Starting_Pitcher park_factor std_PF Row_Number Game_Date Game_Number 
    aased001   108   108  1   1977-07-26  0 
    aased001   94   101  2   1977-07-31  0 
    aased001   100   100.66 3   1977-08-06  0 
    aased001   108   102.5 4   1977-08-11  0 
    aased001   108   103.66 5   1977-08-16  0 
    aased001   96   102.33 6   1977-08-21  0 
    aased001   108   103.14 7   1977-08-26  0 
    aased001   108   103.75 8   1977-08-31  0 
    aased001   104   103.77 9   1977-09-05  1 
    aased001   108   104.2 10   1977-09-10  0 
    aased001   92   103.09 11   1977-09-16  0 
    aased001   106   103.33 12   1977-09-22  0 
    aased001   108   103.69 13   1977-09-27  1 
    aased001   96   96  14   1978-04-11  0 
    aased001   100   13.06 15   1978-04-16  0 
    aased001   100   18.5 16   1978-04-21  0 
    aased001   96   23.05 17   1978-04-28  0 

、私はそれを作成するために、次のコードを使用:

ALTER TABLE starting_pitcher_stats ADD Row_Number int(11) DEFAULT '0' NOT NULL; 
    SELECT @n:=0, Row_Number, Starting_Pitcher, lg_ID, YEAR_ID, Game_Date, Game_Number FROM starting_pitcher_stats; 
    UPDATE starting_pitcher_stats SET Row_Number = @n := @n + 1 

私は次のコードを使用する場合新しい年の開始時に1でROW_NUMBER列の再起動を作るために、新たな投手があった場合、それは動作しません:

ALTER TABLE starting_pitcher_stats ADD ROW_NUMBER1 int(11) DEFAULT '0' NOT NULL; 
SELECT @n:=0, Row_Number, Starting_Pitcher, lg_ID, YEAR_ID, Game_Date, Game_Number FROM starting_pitcher_stats; 
UPDATE starting_pitcher_stats IF std_PF=park_factor THEN SET Row_Number=1 ELSE SET Row_Number1 = @n := @n + 1 

は、私は次のエラーを取得する:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF std_PF=park_factor THEN SET Row_Number=1 ELSE SET Row_Number' at line 1 

ですこのRow_Number列を設定して、Game_Date列のような別の列で並べ替えたりグループ化したりしても1から始まるようにすることは可能ですか?

誰か助けてもらえますか?

ありがとうございます。 リー

UPDATE:ゴードンは、ここで私が取得エラーです:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' 1, 1) 
         ) 
       ) as rn 
     from starting_p' at line 4 

は、私は必要な編集が明らかであると確信しているが、私の経験では、それを見つけることができることが十分ではありません。

はい、そのゲーム「Park_ID」の「YEAR_ID」、「Game_Date」、「Game_Number」、およびホームチームをカプセル化する一意のID「GAME_ID」があります。 double_headersについて私に思い出させてくれてありがとう... "Game_Number"は、利用可能な "GAME_ID"フィールドから派生したフィールドで、ダブルヘッダーのゲーム "1"またはゲーム "2"または1つのゲームの場合はゲーム「0」。 GAME_IDを使用すると、Year_ID、Game_Date、Game Numberで別々に参加するのではなく、プロセスをより効率的にするように聞こえますか?ここで

は、テーブルのサンプル、GAME_IDとYEAR_ID列を含む今回のスクリーンショットです:

enter image description here

私はまだコードのすべてを理解しようとしている...い"sy"から "@sy"をどこかで定義しなければなりませんか?

I ご協力いただきありがとうございます。 リー

UPDATE:

Incorrect integer value: 'aased001:1977:1:1' for column 'row_number' at row 1 

がここに最新です: ここで私は、私は括弧を削除し、私のテーブルに一致するようにフィールドのいくつかの名前を変更することにより、編集されたコードをしようとしたとき、私は受信エラーがあります上記のエラーが発生したコードを使用しました。私はうっかり遠く、それが実現することになっていたものよりもコードをしていない願っています:

UPDATE starting_pitcher_stats JOIN 
      (select starting_pitcher_stats.*, 
        (@rn := if(@sy = concat_ws(':', Starting_Pitcher, YEAR_ID), @rn + 1, 
           @sy := concat_ws(':', Starting_Pitcher, YEAR_ID, 1, 1) 
          ) 
        ) as rn 
      from starting_pitcher_stats 
      cross join 
       (select @rn := 0, @sy := '') AS params 
      order by Starting_Pitcher, YEAR_ID, Game_Date, Game_Number 
      ) as b 
      on b.Starting_Pitcher = starting_pitcher_stats.Starting_Pitcher AND 
       b.YEAR_ID = starting_pitcher_stats.YEAR_ID AND 
       b.Game_Date = starting_pitcher_stats.Game_Date AND 
       b.Game_Number=starting_pitcher_stats.Game_Number 
     set starting_pitcher_stats.row_number= b.rn 

がUPDATE:ここでは、エラーなしで働いていたコードは次のとおりです。

UPDATE starting_pitcher_stats JOIN 
     (select starting_pitcher_stats.*, 
       (@rn := if(@sy = concat_ws(':', Starting_Pitcher, YEAR_ID), @rn + 1, 
          if(@sy := concat_ws(':', Starting_Pitcher, YEAR_ID), 1, 1) 
         ) 
       ) as rn 
     from starting_pitcher_stats CROSS JOIN 
      (select @rn := 0, @sy := '') params 
     order by Starting_Pitcher, YEAR_ID, Game_Date, Game_Number 
     ) sp2 
     on sp2.Starting_Pitcher = starting_pitcher_stats.Starting_Pitcher AND 
      sp2.YEAR_ID = starting_pitcher_stats.YEAR_ID AND 
      sp2.Game_Date = starting_pitcher_stats.Game_Date AND 
      sp2.Game_Number=starting_pitcher_stats.Game_Number 
    set starting_pitcher_stats.row_number = sp2.rn; 
+0

挿入トリガーを使用しますか?挿入時には、指定された開始ピッチャーと指定された年のすべての行を選択します。結果が空の場合は1を、そうでない場合は最大行番号+1を挿入してください。 – ShuberFu

+0

おっと、間違っています。いずれにしても、挿入トリガを試みます。代わりに、最後の行を選択するだけです。年と投手が異なる場合は、1を挿入します。同じ場合は、行番号+ 1を挿入します。 – ShuberFu

答えて

1

それは少しあります列挙を行う痛みはupdateです。しかし、それは可能です。あなたのケースでは

これは、サブクエリでJOINを使用して、おそらく最も簡単です:

update starting_pitcher sp JOIN 
     (select sp.*, 
       (@rn := if(@sy = concat_ws(':', starting_pitcher, year), @rn + 1, 
          if(@sy := concat_ws(':', starting_pitcher, year), 1, 1) 
         ) 
       ) as rn 
     from starting_pitcher_stats cross join 
      (select @rn := 0, @sy := '') params 
     order by starting_pitcher, year, game_date 
     ) sp2 
     on sp2.starting_pitcher = sp.starting_pitcher and 
      sp2.year = sp.year and 
      sp2.game_date = sp.game_date 
    set sp.row_number = sp2.rn; 

注:これはjoinのために3つの列(starting_pitcher, year, game_date)を使用しています。あなたがテーブルに一意のIDを持っているなら、それはより良いことです。特に、サンプルにはダブルヘッダーがありません。したがって、フィールドを追加することもできます。 onの条件では、サブクエリ内の同じ行に1つの行を単に一致させるだけです。

サブクエリを別々に実行すると、何が起きているのかを確認できます。

+0

こんにちはゴードンさん、ありがとうございます。私はそのコードをそのまま試しましたが、私はOPに追加したというエラーが出ます。 – LeeZee

+0

私はそれがちょうど括弧の豊富だと思う。 – Strawberry

+0

括弧を削除していくつかのフィールドの名前をテーブルに合わせて変更しましたが、別のエラーが発生するまで実行されます。私が使用したエラーとコードを見てください。これにOPを追加しました。 – LeeZee

関連する問題