PostgreSQL:根据排序顺序仅选择每个id的第一条记录

时间:2013-09-24 16:56:17

标签: sql postgresql distinct greatest-n-per-group distinct-on

对于以下查询,我只需要选择shape_type值最小的第一条记录(范围从1到10)。如果你有任何关于如何轻松做到这一点的知识是postgresql,请帮忙。谢谢你的时间。

select g.geo_id, gs.shape_type
from schema.geo g   
join schema.geo_shape gs on (g.geo_id=gs.geo_id)  
order by gs.shape_type asc;

1 个答案:

答案 0 :(得分:24)

PostgreSQL为这类查询提供了非常好的语法 - distinct on

  

SELECT DISTINCT ON(表达式[,...])仅保留第一行   给定表达式求值等于的每组行。该   DISTINCT ON表达式使用与之相同的规则进行解释   ORDER BY(见上文)。请注意,每组的“第一行”是   不可预测,除非使用ORDER BY来确保所需的行   首先出现。

所以你的查询变为:

select distinct on(g.geo_id)
    g.geo_id, gs.shape_type
from schema.geo g   
    join schema.geo_shape gs on (g.geo_id=gs.geo_id)  
order by g.geo_id, gs.shape_type asc;

一般来说,ANSI-SQL语法(在具有窗口函数和公用表表达式的任何RDBMS中,可以切换到子查询)将是:

with cte as (
    select
        row_number() over(partition by g.geo_id order by gs.shape_type) as rn,
        g.geo_id, gs.shape_type
    from schema.geo g   
        join schema.geo_shape gs on (g.geo_id=gs.geo_id)  
)
select
    geo_id, shape_type
from cte
where rn = 1