我遇到与In SQL, how to select the top 2 rows for each group中提到的问题相同的问题。答案是正常的。但这需要太多时间。如何优化此查询?
实施例: sample_table
act_id: act_cnt: 1 1 2 1 3 1 4 1 5 1 6 3 7 3 8 3 9 4 a 4 b 4 c 4 d 4 e 4
现在我想将其分组(或使用其他方式)。我想从每组中选择2行。样本输出:
act_id: act_cnt: 1 1 2 1 6 3 7 3 9 4 a 4
我是SQL新手。怎么做?
答案 0 :(得分:3)
您链接的答案使用了一种低效的解决方法,因为MySQL缺少窗口功能。
使用窗口函数的速度可能要快得多,因为您只需要读取一次表格:
select name,
score
from (
select name,
score,
dense_rank() over (partition by name order by score desc) as rnk
from the_table
) t
where rnk <= 2;
SQLFiddle:http://sqlfiddle.com/#!15/b0198/1
在(name, score)
上建立索引可以加快此查询速度。
在问题(和问题)发生变化后进行修改
select act_id,
act_cnt
from (
select act_id,
act_cnt,
row_number() over (partition by act_cnt order by act_id) as rn
from sample_table
) t
where rn <= 2;
新SQLFiddle:http://sqlfiddle.com/#!15/fc44b/1