Можете да използвате аналитични функции
SELECT *
FROM (SELECT c.*,
rank() over (partition by user_id order by ts desc) rnk
FROM comments c)
WHERE rnk = 1
В зависимост от това как искате да се справите с връзките (ако може да има два реда със същия user_id и ts ), може да искате да използвате row_number или dense_rank функция, а не rank . rank би позволило няколко реда да бъдат първи, ако имаше равенство. row_number би връщал произволно един ред, ако имаше равенство. dense_rank би се държал като rank за редовете, които се изравнят за първи, но биха считали следващия ред за втори, а не за трети, ако приемем, че два реда са равни за първи.