Мне нравится ответ Боба Вейла о выполнении max и group by, но вы упомянули, что вам могут потребоваться другие значения.
Если вам нужны другие значения, связанные со строкой, вы можете использовать оконную функцию, такую как row_number (), чтобы получить строки, которые вы ищете, без нахождения в группе.
select id, ts, user, a, b, c, row_rank
from (
select id, ts, user, a, b, c,
row_number() over (partition by user, b, c order by ts desc) as row_rank
from foo
) table_with_row_number
where table_with_row_number.row_rank = 1