I have a couple of rows where values in one column are repeating and I need to get a couple of rows where every value is limited by const.
For example, i have this rows (1, ‘a’) (2, ‘b’) (3, ‘a’) (4,’c’) (5, ‘b’) (6, ‘a’) and i limited every value in select by 2. Then I should not get a row with ID 6 cause this is an extra row cause I limited them by 2.
How I can do that? thx for any help
Advertisement
Answer
If you have just two columns, say id
and val
, and you want just one row per value, then aggregation is enough:
select min(id) as id, val from mytable group by val
If there are more columns, you can use distinct on
:
select distinct on (val) t.* from mytable order by val, id
Finally, if you want to be able to allow a variable number of rows per val
, you can use window functions. Say you want 3 rows maximum per value:
select * from ( select t.*, row_number() over(partition by val order by id) rn from mytable t ) t where rn <= 3