首页 > 解决方案 > 每个组都有多个结果的 max 函数

问题描述

我正在寻找有关 postgresql 查询的帮助。

示例输入数据如下:

pk  name
=========================
1   | notebook cz-2001
2   | notebook cz-2002
3   | notebook cz-2003
4   | notebook cz-2003
5   | notebook cz-2003
6   | notebook cz-2004
7   | notebook cz-2004
8   | notebook cz-2004
9   | notebook cz-2004
10  | notebook cz-2005
11  | notebook cz-2006
12  | notebook cz-2007
13  | notebook cz-2008
14  | notebook cz-2009

某些行在名称列中具有相同的值(笔记本 cz-2003、笔记本 cz-2004)

我可以通过以下查询获得分组名称的一个最大 pk 值:

select * from test_group where pk in
(
select max(pk) from test_group group by name order by name
)

结果:

pk  name
=========================
1   | notebook cz-2001
2   | notebook cz-2002
5   | notebook cz-2003
9   | notebook cz-2004
10  | notebook cz-2005
11  | notebook cz-2006
12  | notebook cz-2007
13  | notebook cz-2008
14  | notebook cz-2009

但我不知道,这是我的问题,例如如何获得分组名称的两个(三个、四个 ...)最高 pk 值。

例如两个最高 pk 的预期结果:

pk  name
=========================
1   | notebook cz-2001
2   | notebook cz-2002
4   | notebook cz-2003
5   | notebook cz-2003
8   | notebook cz-2004
9   | notebook cz-2004
10  | notebook cz-2005
11  | notebook cz-2006
12  | notebook cz-2007
13  | notebook cz-2008
14  | notebook cz-2009

你能给我一些提示如何实现吗?

谢谢

J.P

标签: sqlpostgresql

解决方案


您可以为此使用row_number()窗口函数

演示:db<>小提琴

SELECT pk, name
FROM
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY name ORDER BY pk DESC)
    FROM my_table
) s
WHERE row_number <= 2    -- or any other value

row_number()窗口函数将行号添加到某个有序组。在这里,您的组是name列,顺序是按pk(降序,因为您希望首先计算最高数字)。

使用该WHERE子句,您可以过滤前 n 条记录(编号为 1、2、...)或您喜欢的任何其他元素。


推荐阅读