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

时间:2018-11-22 21:20:54

标签: mysql sql highcharts ranking

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

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

来自该站点的一位朋友,他帮助我获得了“每天每位用户的最新记录”,基于此,我正在研究如何每天,每周或每月对排名结果进行计数,以便使用统计图表或google datastudio,我已经尝试了下一个:

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

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

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

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

enter image description here

2 个答案:

答案 0 :(得分:1)

这将为您提供每位用户最近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

答案 1 :(得分:1)

一种用于获取每个用户在最近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)

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