Можете да използвате аналитични функции
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
за редовете, които се изравнят за първи, но биха считали следващия ред за втори, а не за трети, ако приемем, че два реда са равни за първи.