postgresql统计前3行

时间:2016-03-12 06:51:51

标签: sql postgresql greatest-n-per-group

我知道我们可以在PostreSQL中使用LIMIT来获取关系中的前3个值,但是如果存在重复值会怎样。例如, 五 4 4 3 2

按DESC顺序排序并使用LIMIT 3将返回5,4,4。但是我们如何得到5,4,4,3(前三名有重复)。

我知道如何做到这一点很长但我想知道是否有任何内置的PostreSQL?

2 个答案:

答案 0 :(得分:0)

一种简单的方法是使用dense_rank window function根据需要对值进行排名,然后剥离具有所需等级的值。

例如,鉴于此:

create table t (
  id serial not null primary key, -- just a placeholder so that we can differentiate the duplicate `c`s.
  c int not null
);
insert into t (c)
values (1), (1), (2), (3), (4), (4), (4), (5);

你可能想要c(5,4,3)的行,你可以这样做:

select id, c
from (
  select id, c, dense_rank() over (order by c desc) as r
  from t
) dt
where r <= 3

演示:http://sqlfiddle.com/#!15/5b262/8

请注意,您需要使用dense_rank而不是rank,因为rank会以正确的顺序排列内容,但会在排名中留下空白,因此r <= 3会“必然有用。将上述小提琴中的r值与dense_rankrank进行比较,您会看到差异。

答案 1 :(得分:0)

假设您有以下记录

索引名称
1&#34; ABC&#34;
2&#34; XYZ&#34;
2&#34; ABC&#34;
1&#34; XYZ&#34;
1&#34; XYZ&#34;

在这种情况下,您可以选择非重复记录。

Select distinct index, name from table_name;