PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Връща записи, различни в една колона, но подредени по друга колона

DISTINCT ON

Ако използвате DISTINCT ON , имате нужда от подзаявка за това:

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

Редът в подзаявката трябва да съответства на колоните в DISTINCT ON клауза, така че трябва да го обвиете във външна заявка, за да стигнете до желания ред на сортиране.

Алтернатива с row_number()

Подобна история, имате нужда и от подзаявка:

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;

Вероятно и по-бавно.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pg_config, ruby ​​pg, проблем с postgresql 9.0 след надграждане, centos 5

  2. Повторно вземане на проби от данни от времеви серии

  3. Повече SQL, по-малко код, с PostgreSQL

  4. TypeORM не поддържа настройката на базата данни в декоратора на обекти

  5. Как Cos() работи в PostgreSQL