我知道我们可以在PostreSQL中使用LIMIT来获取关系中的前3个值,但是如果存在重复值会怎样。例如, 五 4 4 3 2
按DESC顺序排序并使用LIMIT 3将返回5,4,4。但是我们如何得到5,4,4,3(前三名有重复)。
我知道如何做到这一点很长但我想知道是否有任何内置的PostreSQL?
答案 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_rank
和rank
进行比较,您会看到差异。
答案 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;