mysql - 如何使用 MySQL 中的 RANK() 窗口函数获取每个组的前 N 条记录?
问题描述
使用 MySQL 中的新窗口函数,我可以通过以下方式获取前 K 条记录
SELECT user_id, score, RANK() OVER w AS 'rank' FROM user_scores WINDOW w AS (ORDER BY score desc)LIMIT k;
但是,如果我想在每个组中获得前 k 名,请使用
SELECT user_id, score, platform, RANK() OVER w AS 'rank' FROM user_scores WINDOW w AS (PARTITION BY platform ORDER BY score desc)LIMIT k;
它只获得排名的 k 记录,这不是我想要的。当尝试将限制添加到窗口时
SELECT user_id, score, platform, RANK() OVER w AS 'rank' FROM user_scores WINDOW w AS (PARTITION BY platform ORDER BY score des LIMIT k);
它报告语法错误。有没有什么办法可以利用这个窗口功能,实现在每组中获取top-k并显示结果?示例是:示例表数据:
+--------------------+----------+-------+
| user_id | platform | score |
+--------------------+----------+-------+
| 62225661637535243 | steam | 5349 |
| 71061003851867964 | xbox | 325 |
| 180508709444817882 | psn | 8710 |
| 207545417195670901 | steam | 13094 |
| 224382767175085374 | steam | 17112 |
+--------------------+----------+-------+
前 10 名的预期输出(与样本数据不匹配):
+------------+-------+----------+------+
| user_id | score | platform | rank |
+------------+-------+----------+------+
| 3081837904 | 19981 | bnet | 1 |
| 2937016388 | 19625 | bnet | 2 |
| 2548218375 | 19026 | bnet | 3 |
| 3379170403 | 18715 | bnet | 4 |
| 2161236967 | 18591 | bnet | 5 |
| 580312064 | 17867 | bnet | 6 |
| 998283136 | 17698 | bnet | 7 |
| 4104228350 | 17632 | bnet | 8 |
| 1296585900 | 17594 | bnet | 9 |
| 778412200 | 17012 | bnet | 10 |
| 726955649 | 19774 | psn | 1 |
| 397001285 | 19590 | psn | 2 |
| 3154882519 | 19256 | psn | 3 |
| 3502267467 | 18926 | psn | 4 |
| 1351561694 | 18915 | psn | 5 |
| 3397147261 | 18567 | psn | 6 |
| 3698675484 | 18160 | psn | 7 |
| 158948633 | 17704 | psn | 8 |
| 1345737383 | 17512 | psn | 9 |
| 2788225545 | 17454 | psn | 10 |
....
解决方案
推荐阅读
- python - 元素类型“hr”必须由 Spark 中匹配的结束标记“”终止
- node.js - sequelize 模型、迁移文件和外键。哪一个是对的?
- c# - 正则表达式获取 \" 和 \" 之间的字符串
- javascript - D3 热图 - 仅显示一种颜色的色标
- spring - 协议是否支持应用程序/JavaScript 内容类型?
- php - Openssl:坏幻数问题
- ionic-framework - Ionic 2 - FCM 自定义声音通知
- mongodb - $lookup nested array in mongodb
- tensorflow - 基于 tf.slim 的多标签分类错误
- c# - C# XML 导入失败