Вы действительно не хотите агрегации. Вы хотите удалить определенные идентификаторы.
Следующее объединяет все значения недели / процента вместе, чтобы получить один идентификатор для идентификации дубликатов. Несмотря на то, что я только что сказал, здесь используется агрегация для «фильтрации», чтобы получить первый:
select min(id) as id, week, percentage
from (select t1.*,
string_agg(concat(week, ':', percentage), ',') within group (order by week) over (partition by id) as id_week_percentages
from table1 t1
) t1
group by id_week_percentages, week, percentage;
Агрегация просто позволяет написать это без дополнительного подзапроса. Вы можете сделать что-то похожее на:
select top (1) with ties id, week, percentage
from (select t1.*,
string_agg(concat(week, ':', percentage), ',') within group (order by week) over (partition by id) as id_week_percentages
from table1 t1
) t1
order by row_number() over (partition by id_week_percentages, week, percentage order by id);
Или использовать отдельный подзапрос для получения первого идентификатора для каждой комбинации неделя / процент.
РЕДАКТИРОВАТЬ:
С for xml path
:
select top (1) with ties id, week, percentage
from (select t1.*,
(select concat(week, ':', percentage, ',')
from table1 tt1
where tt1.id = t1.id
order by week, percentage
for xml path ('')
) as id_week_percentages
from table1 t1
) t1
order by row_number() over (partition by id_week_percentages, week, percentage order by id);