PostgreSQL: выберите только первую запись на один идентификатор на основе порядка сортировки

Для следующего запроса мне нужно выбрать только первую запись с наименьшим значением 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

PostgreSQL имеет очень хороший синтаксис для этих типов запросов - отчет о:

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 для этого (в любой СУБД с функциями окна и общим табличным выражением, который может быть переключен на подзапрос):

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