首页 > 解决方案 > PLPGSQL - 存储过程来获取一组带有计数的行

问题描述

我正在使用 PostgreSQL。

我需要使用 PLPGSQL 语言的存储过程,该语言将返回包含来自 my_table 的前 2 个和后 2 个结果的计数的表(记录集)。

例如:

我的表

id       value
1          a
2          a
3          a
4          b
5          b
6          c
7          c
8          e
9          f
10         g
11         g
12         g
13         g
14         h
15         h

回报:

count           value
  4               g
  3               a
  1               e
  1               f

谢谢

标签: sqlpostgresqlplpgsql

解决方案


您可以将窗口函数与聚合一起使用

select v.value, v.cnt
from (select value, count(*) as cnt,
             row_number() over (order by count(*) desc) as seqnum_desc,
             row_number() over (order by count(*) asc) as seqnum_asc
      from t
      group by value
     ) v
where seqnum_desc <= 2 or seqnum_asc <= 2;

注意:在平局的情况下——尤其是在底端——这将返回具有相同计数的任意值。您可以使用rank()或对此进行调整dense_rank(),具体取决于在这种情况下您想要什么。


推荐阅读