尝试创建一个 "Row Number" 列,在新的一年开始时以及有新的投手时再次从 1 重新开始

trying to create a "Row Number" column that restarts from 1 again at the start of a new year and when there is new stating pitcher

我正在努力确定 MySQL 代码以在我的 table "starting_pitcher_stats" 中创建一个 Row_Number 列,我想从 1 开始,但随后新年伊始,当有新投手时,从 1 重新开始。我使用以下代码创建了 Row_Number 列:

理想情况下,table 看起来像这样:

    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

...现在,table 的示例如下所示:

    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

是否可以设置此 Row_Number 列,使其从 1 开始,即使我按 Game_Date 列之类的另一列对其重新排序(或分组)?

有人可以帮忙吗?

提前谢谢你。 李

更新:戈登,这是我得到的错误:

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

我确定所需的编辑很明显,但我的经验不足以发现它。

是的,有一个唯一的 ID "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?

分别加入

这是 table 示例的屏幕截图,这次包括 GAME_ID 和 YEAR_ID 列:

我仍在尝试理解所有代码...是否必须在某处定义“@sy”中的 "sy"?

我 预先感谢您的帮助。 李

更新: 这是我在尝试通过删除括号并更改某些字段的名称以匹配我的 table 来编辑的代码时收到的错误:

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 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;

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。如果你在 table 中有一个唯一的 id,那就更好了。特别是,您的示例没有双 headers。因此,您可能想要添加其他字段。 on 条件只是将一行匹配到子查询中的同一行。

您可以通过 运行 子查询单独查看发生了什么。