#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. большое вам спасибо! все работает