首页 > 解决方案 > 对按日期分组的所有条目“循环”相同的 SQL 查询

问题描述

我有一张这样的桌子:

+------------+-----------+------+----+
|    date    | player_id | rank | hp |
+------------+-----------+------+----+
| 2021-01-01 |         1 |    1 | 39 |
| 2021-01-01 |         5 |    2 | 20 |
| 2021-01-01 |         2 |    3 | 12 |
| 2021-01-01 |         3 |    4 | 48 |
| 2021-01-01 |         4 |    5 | 25 |
| 2021-01-02 |         1 |    2 | 42 |
| 2021-01-02 |         2 |    1 | 38 |
| 2021-01-02 |         3 |    4 | 21 |
| 2021-01-02 |         4 |    3 | 35 |
| 2021-01-02 |         5 |    5 | 28 |
| 2021-01-03 |         1 |    5 | 38 |
| 2021-01-03 |         3 |    2 | 31 |
| 2021-01-03 |         2 |    3 | 26 |
| 2021-01-03 |         4 |    4 | 22 |
| 2021-01-03 |         5 |    1 | 19 |
+------------+-----------+------+----+

当我使用以下 SQL 代码时:

SELECT * FROM
(SELECT * FROM `players` WHERE date='2021-01-01' ORDER BY rank ASC LIMIT 3) highest_rank
ORDER BY hp DESC LIMIT 2

结果将是这样的:

+------------+-----------+------+----+
|    date    | player_id | rank | hp |
+------------+-----------+------+----+
| 2021-01-01 |         1 |    1 | 39 |
| 2021-01-01 |         5 |    2 | 20 |
+------------+-----------+------+----+

我的问题是结果仅适用于 date='2021-01-01'。我想在数据库中每天都这样做。最终,我希望结果如下所示:

+------------+-----------+------+----+
|    date    | player_id | rank | hp |
+------------+-----------+------+----+
| 2021-01-01 |         1 |    1 | 39 |
| 2021-01-01 |         5 |    2 | 20 |
| 2021-01-02 |         1 |    2 | 42 |
| 2021-01-02 |         2 |    1 | 38 |
| 2021-01-03 |         3 |    2 | 31 |
| 2021-01-03 |         2 |    3 | 26 |
+------------+-----------+------+----+

如何才能做到这一点?如果这有什么不同,我正在使用 MySQL/MariaDB。

标签: mysql

解决方案


问题解决了。信用在评论部分提供了一个几乎有效的解决方案。他撤回了这个建议,因为我认为这不是最终的解决方案。但我对它进行了修补并让它工作。谢谢,粘点!

对于任何对解决方案感兴趣的人:

SELECT date, player_id, rank, hp
FROM
(
    SELECT *,
    row_number() OVER (PARTITION BY date 
               ORDER BY hp DESC) h
    FROM
    (
        SELECT *,
        row_number() OVER (PARTITION BY date
                   ORDER BY rank ASC) r
        FROM players
    ) x
    WHERE r<=3
) y 
WHERE h<=2

推荐阅读