如何优化查询

时间:2014-05-29 10:40:11

标签: postgresql

我遇到与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新手。怎么做?

1 个答案:

答案 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