sql >> Databáze >  >> RDS >> PostgreSQL

Vraťte záznamy odlišné v jednom sloupci, ale seřaďte je podle jiného sloupce

DISTINCT ON

Pokud používáte DISTINCT ON , k tomu potřebujete poddotaz:

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

Pořadí v poddotazu musí souhlasit se sloupci v DISTINCT ON klauzule, takže jej musíte zabalit do vnějšího dotazu, abyste dosáhli požadovaného pořadí řazení.

Alternativa s row_number()

Podobný příběh, potřebujete také poddotaz:

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;

Také pravděpodobně pomalejší.




  1. nainstalovat mysql přes loutku

  2. Testovací oprávnění MySQL

  3. Jaké jsou 10 nejlepších funkcí Microsoft Access?

  4. Proč sem Oracle přidává skrytý sloupec?