我有一张包含统计数据(大约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。图表看起来应该是这样的:
如何进行查询以获得每周前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
但这排列了所有记录,我收回了数百条记录。是否有可能每周只获得前十名,然后进行排名?
提前感谢您的帮助。
答案 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
返回每周切片中的排名值。它将连续每周重置。
您现在可以使用上述查询的结果来提取每周的前10条记录:
SELECT @rnk := @rnk + 1
FROM (
... above query here ...
) AS t1
CROSS JOIN (SELECT @rnk := 0) AS t2
WHERE @rn <= 10
上述查询使用@rnk
变量来计算子查询返回的所有记录的排名。