Поскольку вы используете группу по, вы можете использовать агрегацию с ней. Вам может быть все равно, какое значение C2 возвращается; но Система должна знать, какой вы хотите.
Итак:
SELECT ID, C1, max(C2)
FROM table
GROUP BY ID, C1
ИЛИ используйте оконную функцию, такую как LISTAGG, чтобы объединить все значения в список через запятую
SELECT ID, C1, LISTAGG(C2, ', ') WITHIN GROUP (ORDER BY C2)`
FROM table
GROUP BY ID, C1
Или используйте CTE и оконную функцию для назначения номера строки и ограничения только для 1-й записи каждой группировки. Учитывая другие столбцы и предполагаемое стремление к связанным значениям с тем же значением C2; это кажется лучшим подходом.
WITH CTE AS (
SELECT A.*, Row_number() over (partition by ID, C1 ORDER BY C2) RN
FROM table A)
SELEC *
FROM CTE
WHERE RN = 1