2016-05-15 1 views
0

Ich habe Schwierigkeiten, den MySQL-Code zu bestimmen, um eine Row_Number-Spalte in meiner Tabelle "starting_pitcher_stats" zu erstellen "Ich würde gerne von 1 anfangen, aber dann am Anfang eines neuen Jahres von 1 und wenn es einen neuen Krug gibt. Ich habe den folgenden Code die Row_Number Spalte zu erstellen:versucht, eine "Row Number" -Spalte zu erstellen, die zu Beginn eines neuen Jahres erneut von 1 startet, und wenn es einen neuen Pitcher gibt

Idealerweise wird die Tabelle wie folgt aussehen:

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 

... So wie es jetzt ist, eine Probe der Tabelle sieht wie folgt aus:

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 

und ich Code zu folgendem es zu erstellen:

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 

Wenn ich den folgenden Code verwenden den Row_Number Spalt Neustart bei 1 zu Beginn eines neuen Jahres zu machen, und wenn es ein neuer Krug ist, funktioniert es nicht:

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 

ich die folgende Fehlermeldung erhalten:

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 

Ist ist es möglich, diese Row_Number-Spalte so einzurichten, dass sie bei 1 beginnt, auch wenn ich sie neu anordne oder gruppiere sie nach einer anderen Spalte wie der Game_Date-Spalte?

Kann mir bitte jemand dabei helfen?

Vielen Dank im Voraus. Lee

UPDATE: Gordon, hier ist der Fehler, den ich bekommen:

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 

Ich bin sicher, dass die Bearbeitung erforderlich ist evident, aber meine Erfahrung ist nicht genug, um es zu erkennen.

Ja, es gibt eine eindeutige ID "GAME_ID", die "YEAR_ID", "Game_Date", "Game_Number" und das Heimteam für das Spiel "Park_ID" enthält. Danke, dass du mich an double_headers erinnert hast. "Game_Number" ist ein Feld, das ich aus dem Feld "GAME_ID" abgeleitet habe und das auf Spiel "1" oder Spiel "2" eines Doppel-Headers verweist, falls es einen gab oder Spiel "0" wenn ein einzelnes Spiel. Es klingt, als ob die Verwendung von GAME_ID den Prozess effizienter machen würde, anstatt separat durch Year_ID, Game_Date und Game Number zu verbinden.

Hier ein Screenshot von einer Probe der Tabelle ist, diesmal die GAME_ID und YEAR_ID Spalten einschließlich:

enter image description here

Ich versuche immer noch den gesamten Code zu verstehen ... Does "sy" von "@sy" muss irgendwo definiert werden?

I Vielen Dank im Voraus für Ihre Hilfe. Lee

UPDATE: Hier ist der Fehler, den ich bekam, als ich den Code versucht, die ich durch das Entfernen einer Klammer und Änderung der Namen von einigen der Felder bearbeitet hatte meine Tabelle entsprechen:

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

hier neueste Code, den ich verwendet habe, ergab den obigen Fehler. Ich hoffe, ich habe nicht aus Versehen den Code nehmen weiter weg als das, was es angeblich zu erreichen:

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: Hier ist der Code, ohne Fehler gearbeitet:

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

Verwenden Sie einen Insert-Trigger? Wählen Sie beim Einfügen alle Zeilen des angegebenen Starting Pitcher und des angegebenen Jahres. Wenn das Ergebnis leer ist, fügen Sie 1 ein, wenn nicht, fügen Sie die maximale Zeilennummer + 1 ein. – ShuberFu

+0

Hoppla, missverstanden. Wie auch immer, versuchen Sie immer noch einen Insert-Trigger. Wählen Sie stattdessen die letzte Zeile. Wenn das Jahr und der Krug anders sind, füge 1 ein. Wenn sie gleich sind, füge die Reihennummer + 1 ein. – ShuberFu

Antwort

1

Es ist ein bisschen ein Schmerz, die Aufzählung in einer update zu tun. Aber es ist möglich.

In Ihrem Fall ist dies wahrscheinlich einfachste ein JOIN mit einer Unterabfrage:

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; 

Hinweis: Diese verwendet die drei Säulen (starting_pitcher, year, game_date) für die join. Wenn Sie eine eindeutige ID in der Tabelle haben, ist das besser. Insbesondere hat Ihr Beispiel keine doppelten Header. Vielleicht möchten Sie zusätzliche Felder hinzufügen. Die on Bedingungen sind einfach, um eine Zeile mit der gleichen Zeile in der Unterabfrage übereinzustimmen.

Sie können sehen, was passiert, indem Sie die Unterabfrage separat ausführen.

+0

Hallo Gordon, Danke für deine Hilfe. Ich habe versucht, den Code wie es ist, aber ich bekomme einen Fehler, den ich OP hinzugefügt. – LeeZee

+0

Ich denke, es ist nur eine Überfülle an Klammern. – Strawberry

+0

Ich habe eine Klammer entfernt und die Namen einiger Felder so geändert, dass sie meiner Tabelle entsprechen. Jetzt wird sie ausgeführt, bis ich einen weiteren Fehler erhalte. Bitte sehen Sie sich den Fehler und den Code an, den ich verwendet habe, den ich OP hinzugefügt habe. – LeeZee

Verwandte Themen