2013-09-24 56 views
10

对于以下查询,我只需要选择具有最低shape_type值(范围从1到10)的第一条记录。如果你有任何关于如何轻松做到这一点的知识是postgresql,请帮忙。谢谢你的时间。PostgreSQL:根据排序顺序仅选择每个ID的第一条记录

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; 

回答

20

的PostgreSQL有这种类型的查询非常漂亮的语法 - distinct on

SELECT DISTINCT ON(表达式[,...])只保留的 第一行各自组行的地方给定的表达式评估为相等。使用与 ORDER BY(见上)相同的规则解释DISTINCT ON表达式。请注意,除非使用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 
相关问题