Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Łączenie tabel na podstawie wartości maksymalnej

Odpowiedz na pytanie EDYTOWANE (tj. aby uzyskać również powiązane kolumny).

W Sql Server 2005+ najlepszym podejściem byłoby użycie ranking/window funkcja w połączeniu z CTE , tak:

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;

W przypadku rozwiązania zgodnego z ANSI-SQL podzapytanie i samodzielne łączenie będą działać w następujący sposób:

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;

Ta ostatnia zakłada, że ​​nie ma zduplikowanych kombinacji identyfikator_ucznia/maksymalna liczba punktów, jeśli istnieją i/lub chcesz zaplanować ich usunięcie, będziesz musiał użyć innego podzapytania, aby dołączyć do czegoś deterministycznego, aby zdecydować, który rekord pobrać . Na przykład, zakładając, że nie możesz mieć wielu rekordów dla danego ucznia z tą samą datą, jeśli chcesz złamać remis na podstawie ostatniego max_score, zrobisz coś takiego:

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;

EDYCJA:Dodano poprawne zapytanie deduplikujące dzięki dobremu chwytowi Marka w komentarzach



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lista usług parzenia pokazuje, że mysql działa, ale nie można się połączyć

  2. Jak wyłączyć automatyczne zatwierdzanie dla klienta MySQL?

  3. Wydrukuj wszystkie dane w wielu stronicowaniach

  4. Procedury składowane MySQL

  5. Dlaczego Railsy dodają `OR 1=0` do zapytań używając składni hash klauzuli WHERE z zakresem?