为每个game_index获取前3个条目[复制]

问题描述 投票:0回答:1

这个问题在这里已有答案:

我有一个名为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结合?有任何想法吗?

可以使用其他表成员或临时表。

mysql sql greatest-n-per-group
1个回答
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
                          );
© www.soinside.com 2019 - 2024. All rights reserved.