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;
12 голосов | спросил Sarah Bergquist 24 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 24 Sep 2013 20:56:16 +0400 2013, 20:56:16

1 ответ


0

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

  

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

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
ответил Roman Pekar 24 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 24 Sep 2013 20:57:53 +0400 2013, 20:57:53

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132