PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PostgreSQL DISTINCT ON dengan ORDER BY yang berbeda

Dokumentasi mengatakan:

DISTINCT ON ( ekspresi [, ...] ) hanya menyimpan baris pertama dari setiap set baris di mana ekspresi yang diberikan dievaluasi sama. [...] Perhatikan bahwa "baris pertama" dari setiap set tidak dapat diprediksi kecuali ORDER BY digunakan untuk memastikan bahwa baris yang diinginkan muncul terlebih dahulu. [...] Ekspresi DISTINCT ON harus cocok dengan ekspresi ORDER BY paling kiri.

Dokumentasi resmi

Jadi Anda harus menambahkan address_id sesuai pesanan.

Atau, jika Anda mencari baris lengkap yang berisi produk yang paling baru dibeli untuk setiap address_id dan hasil tersebut diurutkan berdasarkan purchased_at maka Anda mencoba memecahkan N terbesar per masalah grup yang dapat diselesaikan dengan pendekatan berikut:

Solusi umum yang harus bekerja di sebagian besar DBMS:

SELECT t1.* FROM purchases t1
JOIN (
    SELECT address_id, max(purchased_at) max_purchased_at
    FROM purchases
    WHERE product_id = 1
    GROUP BY address_id
) t2
ON t1.address_id = t2.address_id AND t1.purchased_at = t2.max_purchased_at
ORDER BY t1.purchased_at DESC

Solusi yang lebih berorientasi PostgreSQL berdasarkan jawaban @hkf:

SELECT * FROM (
  SELECT DISTINCT ON (address_id) *
  FROM purchases 
  WHERE product_id = 1
  ORDER BY address_id, purchased_at DESC
) t
ORDER BY purchased_at DESC

Masalah diklarifikasi, diperluas, dan diselesaikan di sini:Memilih baris yang diurutkan oleh beberapa kolom dan berbeda di kolom lain



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya bisa menggunakan pemicu PostgreSQL untuk menyimpan perubahan (pernyataan SQL dan perubahan baris)

  2. Cara Mengubah Pengguna menjadi Pengguna Super di PostgreSQL

  3. Apa yang baru di PostgreSQL 13?

  4. Mengembangkan PostgreSQL untuk Windows, Bagian 3

  5. Bagaimana Trunc() Bekerja di PostgreSQL