Ограниченный по значению запрос PostgreSQL

#sql #postgresql #aggregate-functions #greatest-n-per-group

#sql #PostgreSQL #агрегатные функции #наибольшее число пользователей на группу

Вопрос:

У меня есть пара строк, где значения в одном столбце повторяются, и мне нужно получить пару строк, где каждое значение ограничено значением const .

Например, у меня есть следующие строки (1, ‘a’) (2, ‘b’) (3, ‘a’) (4,’c’) (5, ‘b’) (6, ‘a’), и я ограничил каждое значение в select на 2. Тогда я не должен получать строку с идентификатором 6, потому что это дополнительная строка, потому что я ограничил их на 2.

Как я могу это сделать? спасибо за любую помощь

Ответ №1:

Если у вас есть только два столбца, скажем id , и val , и вам нужна только одна строка для каждого значения, то агрегации достаточно:

 select min(id) as id, val
from mytable
group by val
 

Если столбцов больше, вы можете использовать distinct on :

 select distinct on (val) t.*
from mytable
order by val, id
 

Наконец, если вы хотите иметь возможность разрешать переменное количество строк в каждой val , вы можете использовать оконные функции. Допустим, вам нужно максимум 3 строки для каждого значения:

 select *
from (
    select t.*, row_number() over(partition by val order by id) rn
    from mytable t
) t
where rn <= 3
 

Комментарии:

1. большое вам спасибо! все работает