2016-05-15 1 views
0

Я изо всех сил пытаюсь определить код MySQL для создания столбца Row_Number в моей таблице «start_pitcher_stats» «что я хотел бы начать с 1, а затем перезапустить с 1 в начале нового года и когда появится новый кувшин. Я использовал следующий код для создания столбца row_number:пытается создать столбец «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 

Когда я использую следующий код чтобы сделать рестарт колонки row_number на 1 в начале нового года, и когда есть новый кувшин, он не работает:

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 

Is можно установить этот столбец Row_Number таким образом, чтобы он начинался с 1, даже когда я его переупорядочивал (или группировал) другим столбцом, например столбцом Game_Date?

Может кто-нибудь помочь с этим?

Заранее спасибо. Ли

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 

Я уверен, что редактирование требуется, очевидно, но мой опыт не достаточно, чтобы быть в состоянии обнаружить его.

Да, есть уникальный идентификатор «GAME_ID», который инкапсулирует «YEAR_ID», «Game_Date», «Game_Number» и домашнюю команду для этой игры «Park_ID». Спасибо, что напомнили мне о double_headers ... «Game_Number» - это поле, которое я получил из поля «GAME_ID», которое доступно, и относится к игре «1» или игре «2» двойного заголовка, если был один или игра «0», если одна игра. Похоже, что использование GAME_ID сделает процесс более эффективным, вместо того, чтобы присоединяться отдельно по Year_ID, Game_Date и Game Number?

Вот скриншот образца таблицы, на этот раз включая game_id и YEAR_ID колонок:

enter image description here

Я все еще пытаюсь понять весь код ... Does «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

Ой, неправильно понят. В любом случае, попробуйте триггер insert. Но вместо этого просто выберите последнюю строку. Если год и кувшин разные, вставьте 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; 

Примечание: Это использует три колонки (starting_pitcher, year, game_date) для join. Если у вас есть уникальный идентификатор в таблице, это лучше. В частности, ваш образец не имеет двойных заголовков. Таким образом, вы можете добавить дополнительные поля. Условия on просто соответствуют одной строке в той же строке в подзапросе.

Вы можете видеть, что происходит, запустив подзапрос отдельно.

+0

Привет, Гордон, Спасибо за помощь. Я пробовал код как есть, но я получаю сообщение об ошибке, которое я добавил в OP. – LeeZee

+0

Я думаю, что это просто избыток круглых скобок. – Strawberry

+0

Я удалил скобку и изменил имена некоторых полей в соответствии с моей таблицей, и теперь она выполняется до тех пор, пока я не получу еще одну ошибку. Пожалуйста, см. Ошибку и код, который я использовал, который я добавил OP. – LeeZee

Смежные вопросы