对于以下查询,我只需要选择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;
答案 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