一尘不染

Postgresql:如何从每个组/类别中选择前n个%(%)条目

sql

我们是postgres的新手,我们有以下查询,通过该查询我们可以从每个类别中选择前N个记录。

 create table temp (
     gp char,
     val int
 );

 insert into temp values ('A',10);
 insert into temp values ('A',8);
 insert into temp values ('A',6);
 insert into temp values ('A',4);
 insert into temp values ('B',3);
 insert into temp values ('B',2);
 insert into temp values ('B',1);

 select a.gp,a.val
 from   temp a
 where  a.val in (
              select b.val
              from   temp b
              where  a.gp=b.gp
              order by b.val desc
             limit 2);

以上查询的输出是这样的

 gp   val
 ----------
 A    10
 A    8
 B    3
 B    2

但是我们的要求有所不同,我们想从每个类别中选择前n%个记录,其中n不固定,n基于每个组中某些元素的百分比。


阅读 235

收藏
2021-03-10

共1个答案

一尘不染

要基于每个组中行数的百分比来检索行,可以使用两个窗口函数:一个对行进行计数,另一个对行赋予唯一编号。

select gp,
       val
from (
  select gp, 
         val,
         count(*) over (partition by gp) as cnt,
         row_number() over (partition by gp order by val desc) as rn
  from temp
) t
where rn / cnt <= 0.75;

SQLFiddle示例:http
://sqlfiddle.com/#!15/94fdd/1


顺便说一句:使用char几乎总是一个坏主意,因为它是固定长度的数据类型,被填充为定义的长度。我希望您只是为了设置示例而已,不要在实际表中使用它。

2021-03-10