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()
对此进行调整,具体取决于您在这种情况下的需要。
我正在使用 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()
对此进行调整,具体取决于您在这种情况下的需要。