23

对于以下查询,我只需要选择具有最低 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;
4

1 回答 1

38

对于这种类型的查询,PostgreSQL 有非常好的语法——不同的是

SELECT DISTINCT ON ( expression [, ...] ) 只保留给定表达式计算结果为相等的每组行的第一行。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
于 2013-09-24T16:57:53.103 回答