Postgres select (group by type)

14 浏览
0 Comments

Postgres select (group by type)

我有一个表格,格式如下:

ID     NAME      TYPE  RATING
1      name1      1      98
2      name2      1      17
3      name3      2      77
4      name4      2      53
5      name5      2      23
6      name6      4      64
7      name7      3      78
8      name8      3      56
9      name9      3      22
10     name10     4      56
11     name11     4      99
.      ...        .      ..

我该如何从这个表格中选择,例如每个"type"中评分最高的(2,3...等等, N)行数据?

结果示例(选择2行):

ID     NAME      TYPE  RATING
1      name1      1      98
2      name2      1      17
3      name3      2      77
4      name4      2      53
7      name7      3      78
8      name8      3      56
6      name6      4      64
11     name11     4      99
.      ...        .      ..

0
0 Comments

问题:

在Postgres中,如何实现按类型(type)分组后进行查询?

解决方法:

可以使用窗口函数row_number为每一行分配一个排名,然后按类型(type)分组进行查询。具体步骤如下:

1. 使用子查询,从原始表(mytable)中选择id、name、type和rating字段,并使用row_number函数为每一行分配一个排名(rn),按rating字段降序排序。具体语句如下:

SELECT id, name, type, rating,
          ROW_NUMBER() OVER (PARTITION BY type ORDER BY rating DESC) AS rn
   FROM mytable

2. 在子查询的基础上,使用外层查询筛选出每个类型(type)中排名前三的行数据,可以根据需求修改筛选条件。具体语句如下:

SELECT id, name, type, rating
   FROM (子查询)
   WHERE rn <= 3;

这样就可以按类型(type)分组后查询出每个类型中排名前三的行数据。

完整代码如下:

SELECT id, name, type, rating
FROM   (SELECT id, name, type, rating,
               ROW_NUMBER() OVER (PARTITION BY type ORDER BY rating DESC) AS rn
        FROM   mytable)
WHERE  rn <= 3;

0