首页 > 解决方案 > SQL 中最好的 12 个,共 12 个

问题描述

为跑步比赛系列计分。他们根据完成的成绩在每个月的比赛中获得积分。他们的总成绩是 12 场每月比赛中最好的 10 场。我如何为每个成员获得它?

tblRacePoints memnum - 会员编号 RaceNo - YYYYMM,例如,201910 Points

我想要他们在所有比赛中的总分,他们最好的 12 场比赛的总成绩,以及他们今年最低的两个成绩。不是每个人都完成了所有的比赛,所以他们今年可能没有 12 个参赛作品。

我如何编写查询来执行此操作,然后按最佳 10/12 分对它们进行排名?

标签: sql

解决方案


如果您使用的是 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)

推荐阅读