我有一张这样的桌子:
+------------+-----------+------+----+
| 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,如果这有什么不同的话。
发布于 2021-04-27 02:14:15
问题解决了。功劳归功于评论部分的粘性位,它提供了一个几乎有效的解决方案。他收回了这个建议,因为我认为这不是最终的解决方案。但我对它进行了修补,并使其正常工作。谢谢,sticky bit!
对于任何对该解决方案感兴趣的人:
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<=2https://stackoverflow.com/questions/67258067
复制相似问题