Я думаю, что наиболее понятный способ сделать это с помощью представлений или общих табличных выражений.Я буду использовать общие табличные выражения.
create table test (
id integer primary key,
name varchar(20) not null,
number integer not null,
address varchar(30) not null
);
insert into test values
(1, 'channel A', 0, 'http://stream01'),
(2, 'channel B', 2, 'http://stream02'),
(3, 'channel C', 16, 'http://stream03'),
(4, 'channel B', 2, 'http://stream04'),
(5, 'channel B', 16, 'http://stream05'),
(6, 'channel C', 16, 'http://stream06'),
(7, 'channel A', 7, 'http://stream07'),
(8, 'channel A', 5, 'http://stream08'),
(9, 'channel A', 0, 'http://stream09');
with unique_name_num as (
select distinct name, number
from test
),
min_id as (
select number, name, min(id) id
from test
group by number, name
)
select t.*
from test t
inner join unique_name_num u on u.name = t.name and u.number = t.number
inner join min_id m on m.number = t.number and m.name = t.name and m.id = t.id
order by t.name, t.number