Puede usar funciones analíticas
SELECT *
FROM (SELECT c.*,
rank() over (partition by user_id order by ts desc) rnk
FROM comments c)
WHERE rnk = 1
Dependiendo de cómo desee manejar los vínculos (si puede haber dos filas con el mismo user_id
y ts
), es posible que desee utilizar el row_number
o dense_rank
función en lugar de rank
. rank
permitiría que varias filas fueran las primeras si hubiera un empate. row_number
devolvería arbitrariamente una fila si hubiera un empate. dense_rank
se comportaría como rank
para las filas que empataron en primer lugar, pero considerarían que la siguiente fila sería la segunda en lugar de la tercera, suponiendo que dos filas empataran en primer lugar.