sql - SQL 中最好的 12 个,共 12 个
问题描述
为跑步比赛系列计分。他们根据完成的成绩在每个月的比赛中获得积分。他们的总成绩是 12 场每月比赛中最好的 10 场。我如何为每个成员获得它?
tblRacePoints memnum - 会员编号 RaceNo - YYYYMM,例如,201910 Points
我想要他们在所有比赛中的总分,他们最好的 12 场比赛的总成绩,以及他们今年最低的两个成绩。不是每个人都完成了所有的比赛,所以他们今年可能没有 12 个参赛作品。
我如何编写查询来执行此操作,然后按最佳 10/12 分对它们进行排名?
解决方案
如果您使用的是 MSSQL 数据库,您可以使用如下的 ROW_NUMBER 来实现所需的输出。相同的逻辑也可以用于其他一些数据库。
注意:表结构只是一个假设。
WITH your_table(player_id,dt,points)
AS
(
SELECT 1,'20190101', 100 UNION ALL SELECT 1,'20190201', 200 UNION ALL
SELECT 1,'20190301', 300 UNION ALL SELECT 1,'20190401', 400 UNION ALL
SELECT 1,'20190501', 500 UNION ALL SELECT 1,'20190601', 600 UNION ALL
SELECT 1,'20190701', 700 UNION ALL SELECT 1,'20190801', 800 UNION ALL
SELECT 1,'20190901', 900 UNION ALL SELECT 1,'20191001', 1000 UNION ALL
SELECT 1,'20191101', 1100 UNION ALL SELECT 1,'20191201', 1200 UNION ALL
SELECT 2,'20190101', 400 UNION ALL SELECT 2,'20190201', 200 UNION ALL
SELECT 2,'20190301', 300 UNION ALL SELECT 2,'20190401', 400 UNION ALL
SELECT 2,'20190501', 500 UNION ALL SELECT 2,'20190601', 600 UNION ALL
SELECT 2,'20190701', 700 UNION ALL SELECT 2,'20190801', 800 UNION ALL
SELECT 2,'20190901', 900 UNION ALL SELECT 2,'20191001', 1000 UNION ALL
SELECT 2,'20191101', 1100 UNION ALL SELECT 2,'20191201', 1200
)
SELECT
player_id,
YEAR(dt) Year,
SUM(Points) total_point
FROM
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY player_id, YEAR(dt) ORDER BY Points DESC) RN
FROM your_table
)A
WHERE RN <= 10
GROUP BY player_id, YEAR(dt)
推荐阅读
- python - Python 找不到 Selenium 模块
- php - php可以同时处理多个http post请求吗?
- swift - iOS 通过蓝牙获取附近设备(iPad 和 iPhone)列表
- react-admin - 在 React-Admin 中,我可以禁用由 EmailField 创建的 mailto 链接吗?
- sql - Oracle 中是否有其他运算符(除了 rownum)来显示查询中的最高结果
- android - 适用于不同设备的 LibGDX 纹理质量
- go - 在 golang 上测试双向 rpc
- php - 为什么当我使用“--enable-debug”编译的 PHP 运行代码“foreach”时会生成一个核心
- python-3.x - 有没有办法在网页中获取标签的参数?
- php - 删除 Symfony4/Doctrine 的外键和级联问题