Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana saya bisa menanyakan peringkat untuk pengguna di DB saya, tetapi hanya mempertimbangkan entri terbaru untuk setiap pengguna?

Inilah yang saya sebut masalah "terbesar-n-per-grup". Itu muncul beberapa kali per minggu di StackOverflow.

Saya memecahkan masalah jenis ini menggunakan teknik gabungan luar:

SELECT s1.*, s1.wins / s1.losses AS win_loss_ratio
FROM Scrape s1
LEFT OUTER JOIN Scrape s2
  ON (s1.username = s2.username AND s1.ScrapeDate < s2.ScrapeDate)
WHERE s2.username IS NULL
ORDER BY win_loss_ratio DESC;

Ini hanya akan mengembalikan satu baris untuk setiap nama pengguna -- baris dengan nilai terbesar di ScrapeDate kolom. Itulah gunanya gabungan luar, untuk mencoba untuk mencocokkan s1 dengan beberapa baris lain s2 dengan nama pengguna yang sama dan tanggal yang lebih besar. Jika tidak ada baris seperti itu, gabungan luar mengembalikan NULL untuk semua kolom s2 , dan kemudian kita tahu s1 sesuai dengan baris dengan tanggal terbesar untuk nama pengguna tersebut.

Ini juga akan berfungsi saat Anda sedang menyelesaikan pengikisan sebagian.

Teknik ini tidak harus secepat solusi CTE dan RANKING yang diberikan oleh jawaban lain. Anda harus mencoba keduanya dan melihat mana yang lebih cocok untuk Anda. Alasan saya lebih memilih solusi saya adalah karena solusi ini bekerja dalam semua jenis SQL.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kinerja Pengindeksan BigInt vs VarChar

  2. group_concat di SQL Server 2008

  3. MSDTC di server 'server tidak tersedia'

  4. Apa yang dimaksud dengan kunci baris, halaman, dan tabel? Dan kapan mereka diakuisisi?

  5. Mengubah penyortiran Database SQL Server