使用重复的数据库记录创建排名和统计

create a ranking and statistics with repeated database records

今天我想获得有关在我的数据库中为每个用户创建分数的帮助。我有这个查询:

SELECT
    r1.id,
    r1.nickname,
    r1.fecha,
    r1.bestia1,
    r1.bestia2,
    r1.bestia3,
    r1.bestia4
    r1.bestia5
FROM
    reporte AS r1
INNER JOIN
    ( SELECT
          nickname, MAX(fecha) AS max_date
      FROM
          reporte
      GROUP BY
          nickname ) AS latests_reports 
ON latests_reports.nickname = r1.nickname
AND latests_reports.max_date = r1.fecha
ORDER BY
    r1.fecha DESC

来自这个网站的朋友,他帮助我获得了 "the last record per user in each day",基于此,我正在研究如何每天、每周或每月计算排名中的结果,以便使用统计图表或google datastudio,我试过下一个:

select id, nickname, sum(bestia1), sum(bestia2), etc...

但它没有给出我想要的完整结果。这就是我寻求帮助的原因。另外,我知道 datastudio 过滤器,我可以在其中显示很多图表,但我仍然可以完全计数。

例如,一位玩家在过去 30 天内报告杀死了 265 个怪物,但是当我在 datastudio 中使用我的查询时,它只计算最新值(可以是 12)。所以我想正确计数以便与图表一起使用

SQL 使用我的查询过滤的记录:

这将为您提供过去 30 天内每位用户杀死的怪物数量:

SELECT
    nickname,
    sum(bestia1) as bestia1,
    sum(bestia2) as bestia2,
    sum(bestia3) as bestia3,
    sum(bestia4) as bestia4,
    sum(bestia5) as bestia5
FROM
    reporte 
WHERE   fecha >= DATE_ADD(curdate(), interval -30 day)
GROUP BY nickName
ORDER BY

获取每个用户在 最近 X 天 杀死的怪物总数并进行分数计算的一种通用方法,就像您在评论中提出的那样,可以是这样的:

SET @daysOnHistory = X; -- Where X should be an integer positive number (like 10).

SELECT
    nickname,
    SUM(bestia1) AS total_bestia1_killed,
    SUM(bestia2) AS total_bestia2_killed,
    SUM(bestia3) AS total_bestia3_killed,
    SUM(bestia4) AS total_bestia4_killed,
    SUM(bestia5) AS total_bestia5_killed,
    SUM(bestia1 + bestia2 + bestia3 + bestia4 + bestia5) AS total_monsters_killed,
    SUM(bestia1 +  2 * bestia2 + 3 * bestia3 + 4 * bestia4 + 5 * bestia5) AS total_score
FROM
    reporte
WHERE
    fecha >= DATE_ADD(DATE(NOW()), INTERVAL -@daysOnHistory DAY)
GROUP BY
    nickname
ORDER BY
    total_score DESC

现在,如果您想要相同的计算但只考虑当前周的 (假设一周从星期一开始),您需要替换之前的 WHERE 下一个子句:

WHERE
    fecha >= DATE_ADD(DATE(NOW()), INTERVAL -WEEKDAY(NOW()) DAY)

更重要的是,如果您想要全部相同,但只考虑当月的 ,则需要将 WHERE 子句替换为:

WHERE
    MONTH(fecha) = MONTH(NOW())

为了评估当年天的统计数据,您需要将WHERE子句替换为:

WHERE
    YEAR(fecha) = YEAR(NOW())

最后,对于特定天数的评估,您可以使用,例如:

WHERE
    DATE(fecha) BETWEEN CAST("2018-10-15" AS DATE) AND CAST('2018-11-10' AS DATE)

希望本指南对您有所帮助并阐明您的观点。