获取每个game_index的前3个条目

时间:2019-04-05 19:41:23

标签: mysql sql greatest-n-per-group

我有一个名为source的(简体)表:

game_index  int,
rating      int,
attributes  varchar(42)

现在我正在寻找一个选择命令,该命令提取每个游戏(rating)的前3条记录(game_index)。我想将结果存储到另一个表中(称为max,具有相同的表布局)。因此可以使用多个SQL命令。

没有game_index,这很容易:

INSERT INTO max
SELECT * FROM source
ORDER BY rating DESC LIMIT 3

如何将其与GROUP BY game_index结合? 有什么想法吗?

可以有其他表成员或临时表。

1 个答案:

答案 0 :(得分:1)

在MySQL 8+中,您可以这样做:

 INSERT INTO max (. . . )  -- list the columns here
    SELECT . . .  -- list the columns here
    FROM (SELECT s.*,
                 ROW_NUMBER() OVER (PARTITION BY game_index ORDER BY rating DESC) as seqnum
          FROM source s
         ) s
    WHERE seqnum <= 3;

这在较早的版本中更难。如果rating是唯一的,一种可行的方法是:

INSERT INTO max ( . . . )  -- list columns here
    SELECT . . . 
    FROM source s
    WHERE s.rating >= ANY (SELECT s2.rating
                           FROM source s2
                           WHERE s2.game_index = s.game_index
                           ORDER BY s2.rating DESC
                           LIMIT 1 OFFSET 2
                          );