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

Dapatkan jumlah yang berbeda dari kolom tabel yang digabungkan

Untuk mendapatkan hasil tanpa subquery , Anda harus menggunakan tipuan fungsi jendela tingkat lanjut:

SELECT sum(count(*))       OVER () AS tickets_count
     , sum(min(a.revenue)) OVER () AS atendees_revenue
FROM   tickets   t
JOIN   attendees a ON a.id = t.attendee_id
GROUP  BY t.attendee_id
LIMIT  1;

sqlfiddle

Bagaimana cara kerjanya?

Kunci untuk memahami ini adalah urutan peristiwa dalam kueri:

fungsi agregat -> fungsi jendela -> DISTINCT -> LIMIT

Selengkapnya:

  • Cara terbaik untuk mendapatkan jumlah hasil sebelum LIMIT diterapkan

Langkah demi langkah:

  1. Saya GROUP BY t.attendee_id - yang biasanya Anda lakukan dalam subkueri.

  2. Kemudian saya menjumlahkan hitungan untuk mendapatkan jumlah total tiket. Tidak terlalu efisien, tetapi dipaksa oleh kebutuhan Anda. Fungsi agregat count(*) dibungkus dalam fungsi jendela sum( ... ) OVER () untuk sampai pada ekspresi yang tidak terlalu umum:sum(count(*)) OVER () .

    Dan jumlahkan pendapatan minimum per peserta untuk mendapatkan jumlah tanpa duplikat.

    Anda juga dapat menggunakan max() atau avg() bukannya min() dengan efek yang sama seperti revenue dijamin sama untuk setiap baris per peserta.

    Ini bisa lebih sederhana jika DISTINCT diizinkan di fungsi jendela, tetapi PostgreSQL belum (belum) mengimplementasikan fitur ini. Per dokumentasi:

    Fungsi jendela agregat, tidak seperti fungsi agregat normal, tidak mengizinkan DISTINCT atau ORDER BY untuk digunakan dalam daftar argumen fungsi.

  3. Langkah terakhir adalah mendapatkan satu baris. Ini dapat dilakukan dengan DISTINCT (Standar SQL) karena semua baris sama. LIMIT 1 akan lebih cepat, meskipun. Atau formulir standar SQL FETCH FIRST 1 ROWS ONLY .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kiat untuk Menyimpan Cadangan PostgreSQL di Amazon AWS

  2. Tanggal PostgreSQL() dengan zona waktu

  3. Tentang kegunaan indeks ekspresi

  4. Menjalankan beberapa pernyataan dengan Postgresql melalui SQLAlchemy tidak mempertahankan perubahan

  5. Jumlah SQL bersyarat