PLPGSQL - 获取一组具有计数的行的存储过程

PLPGSQL - stored procedure to get a set of rows with count

我正在使用 PostgreSQL。

我需要使用 PLPGSQL 语言的存储过程,它将 return table (SET OF RECORDS) 包含来自 my_table 的前 2 个和后 2 个结果的计数。

例如:

my_table

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

Returns:

count           value
  4               g
  3               a
  1               e
  1               f

谢谢

您可以使用 window 函数进行聚合

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;

注意:在平局的情况下——特别是在底端——这个 returns 具有相同计数的任意值。您可以使用 rank()dense_rank() 对此进行调整,具体取决于您在这种情况下的需要。