Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bergabung dengan tabel berdasarkan nilai maksimum

Menjawab pertanyaan yang DIEDIT (yaitu untuk mendapatkan kolom terkait juga).

Di Sql Server 2005+, pendekatan terbaik adalah menggunakan peringkat/jendela fungsi dalam hubungannya dengan CTE , seperti ini:

with exam_data as
(
    select  r.student_id, r.score, r.date,
            row_number() over(partition by r.student_id order by r.score desc) as rn
    from    exam_results r
)
select  s.name, d.score, d.date, d.student_id
from    students s
join    exam_data d
on      s.id = d.student_id
where   d.rn = 1;

Untuk solusi yang sesuai dengan ANSI-SQL, subquery dan self-join akan berfungsi, seperti ini:

select  s.name, r.student_id, r.score, r.date
from    (
            select  r.student_id, max(r.score) as max_score
            from    exam_results r
            group by r.student_id
        ) d
join    exam_results r
on      r.student_id = d.student_id
and     r.score = d.max_score
join    students s
on      s.id = r.student_id;

Yang terakhir ini mengasumsikan tidak ada kombinasi student_id/max_score duplikat, jika ada dan/atau Anda ingin merencanakan untuk menghapus duplikatnya, Anda harus menggunakan subquery lain untuk bergabung dengan sesuatu yang deterministik untuk memutuskan catatan mana yang akan ditarik . Misalnya, dengan asumsi Anda tidak dapat memiliki beberapa catatan untuk siswa tertentu dengan tanggal yang sama, jika Anda ingin memecahkan seri berdasarkan max_score terbaru, Anda akan melakukan sesuatu seperti berikut:

select  s.name, r3.student_id, r3.score, r3.date, r3.other_column_a, ...
from    (
            select  r2.student_id, r2.score as max_score, max(r2.date) as max_score_max_date
            from    (
                        select  r1.student_id, max(r1.score) as max_score
                        from    exam_results r1
                        group by r1.student_id
                    ) d
            join    exam_results r2
            on      r2.student_id = d.student_id
            and     r2.score = d.max_score
            group by r2.student_id, r2.score
        ) r
join    exam_results r3
on      r3.student_id = r.student_id
and     r3.score = r.max_score
and     r3.date = r.max_score_max_date
join    students s
on      s.id = r3.student_id;

EDIT:Menambahkan kueri de-duplikasi yang tepat berkat tangkapan Mark yang bagus di komentar



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Integritas Data dan Pertimbangan Kinerja dalam Replikasi Semisinkron MySQL

  2. PHP MySQL Query paling populer dalam 24 jam terakhir

  3. Masukkan kode html ckeditor ke dalam database

  4. Arsitek untuk Keamanan:Panduan untuk MySQL

  5. Virtualmin:Anda Tidak Memiliki Akses ke Database MySQL Ini Setelah Mengubah Kata Sandi