sql >> Database >  >> RDS >> PostgreSQL

Records die in de ene kolom verschillend zijn, maar op een andere kolom worden gerangschikt

DISTINCT ON

Als u DISTINCT ON , daar heb je een subquery voor nodig:

SELECT *
FROM  (
   SELECT DISTINCT ON (conversation_id) *
   FROM   message t
   ORDER  BY conversation_id, created_at DESC
   ) sub
ORDER BY created_at DESC;

De volgorde in de subquery moet overeenkomen met de kolommen in de DISTINCT ON clausule, dus je moet het in een buitenste query verpakken om tot de gewenste sorteervolgorde te komen.

Alternatief met row_number()

Soortgelijk verhaal, je hebt ook een subquery nodig:

SELECT id, sender_id, receiver_id, conversation_id, subject, body, created_at
FROM  (
   SELECT *, row_number() OVER (PARTITION BY conversation_id
                                ORDER BY created_at DESC) AS rn
   FROM   message t
   ) sub
WHERE  rn = 1
ORDER  BY created_at DESC;

Ook waarschijnlijk langzamer.




  1. mysql TIME_WAIT; te veel verbindingen probleem

  2. Laravel Welsprekend Negeer Behuizing

  3. ORDER BY met Inner query, waardoor ORA-00907 rechter haakje ontbreekt

  4. Docker:Combineer meerdere afbeeldingen