PostgreSQL中的分组LIMIT:显示每个组的前N行?

10 浏览
0 Comments

PostgreSQL中的分组LIMIT:显示每个组的前N行?

我需要按自定义列排序,对每个组取前N行。

给定以下表格:

db=# SELECT * FROM xxx;
 id | section_id | name
----+------------+------
  1 |          1 | A
  2 |          1 | B
  3 |          1 | C
  4 |          1 | D
  5 |          2 | E
  6 |          2 | F
  7 |          3 | G
  8 |          2 | H
(8 rows)

我需要对每个section_id取前2行(按name排序),即类似于以下结果:

 id | section_id | name
----+------------+------
  1 |          1 | A
  2 |          1 | B
  5 |          2 | E
  6 |          2 | F
  7 |          3 | G
(5 rows)

我使用的是PostgreSQL 8.3.5。

admin 更改状态以发布 2023年5月19日
0
0 Comments

自 v9.3 版本起,你可以进行侧边连接

select distinct t_outer.section_id, t_top.id, t_top.name from t t_outer
join lateral (
    select * from t t_inner
    where t_inner.section_id = t_outer.section_id
    order by t_inner.name
    limit 2
) t_top on true
order by t_outer.section_id;

这可能会更快,但当然,你应该针对你的数据和使用情况进行性能测试。

0
0 Comments

新解决方案(PostgreSQL 8.4)

SELECT
  * 
FROM (
  SELECT
    ROW_NUMBER() OVER (PARTITION BY section_id ORDER BY name) AS r,
    t.*
  FROM
    xxx t) x
WHERE
  x.r <= 2;

0