Postgres select (group by type)
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 . ... . ..
问题:
在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;