MySQL查询随着时间的推移创建排名图表

时间:2018-02-12 13:59:28

标签: mysql charts rank data-partitioning

我有一张包含统计数据(大约100,000行)的表,其格式如下:

WeekNum   Name     Value   Category
201751    Joe      15      X
201751    Max      23      X 
201751    Jim      7       X
201752    Joe      18      X
201752    John     17      X
201752    Max      31      X
201752    Jim      13      X
etc.

现在,我想创建一个包含Google Charts的折线图,以显示前10名。我想创建一个JSON,然后提供Google Chart API。图表看起来应该是这样的:

enter image description here

如何进行查询以获得每周前10名?我在这里遇到了一些排名问题并调整了我的查询:

SELECT S.WeekNum, S.Name, S.Value, @curRank := @curRank + 1 AS Rank
FROM table S, (SELECT @curRank := 0) R
WHERE S.Category = 'X'
ORDER BY S.WeekNum, S.Value DESC

但这排列了所有记录,我收回了数百条记录。是否有可能每周只获得前十名,然后进行排名?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您可以使用以下查询:

SELECT WeekNum, Name, Value, 
       @rn := IF( @week = WeekNum, @rn + 1, IF(@week := WeekNum, 1, 1)) AS rn
FROM mytable
CROSS JOIN (SELECT @week := 0, @rn :=0) As v
ORDER BY WeekNum, Value DESC

为了模拟MySQL中没有的ROW_NUMBER() OVER (PARTITION BY ... ORDER BY)窗口函数。

以上查询的输出:

WeekNum Name    Value   rn
---------------------------
201751  Max     23      1
201751  Joe     15      2
201751  Jim     7       3
201752  Max     31      1
201752  Joe     18      2
201752  John    17      3
201752  Jim     13      4

字段rn返回每周切片中的排名值。它将连续每周重置。

Demo here

您现在可以使用上述查询的结果来提取每周的前10条记录:

SELECT @rnk := @rnk + 1
FROM (
   ... above query here ...
) AS t1
CROSS JOIN (SELECT @rnk := 0) AS t2
WHERE @rn <= 10

上述查询使用@rnk变量来计算子查询返回的所有记录的排名。