Mysql
 sql >> база данни >  >> RDS >> Mysql

Съединяване на таблици въз основа на максималната стойност

Отговаряне на РЕДАКТИРАН въпрос (т.е. за да получите и свързани колони).

В Sql Server 2005+ най-добрият подход би бил да се използва ranking/window функция във връзка с CTE , като това:

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;

За решение, съвместимо с ANSI-SQL, подзаявката и самостоятелното присъединяване ще работят, както следва:

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;

Последното предполага, че няма дублирани комбинации student_id/max_score, ако има и/или искате да планирате да ги премахнете, ще трябва да използвате друга подзаявка, към която да се присъедините с нещо детерминирано, за да решите кой запис да изтеглите . Например, ако приемем, че не можете да имате няколко записа за даден ученик с една и съща дата, ако искате да прекъснете равенството въз основа на най-новия max_score, бихте направили нещо като следното:

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;

РЕДАКТИРАНЕ:Добавена е подходяща заявка за премахване на дублирането благодарение на добрия улов на Марк в коментарите



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CONCAT с GROUP_CONCAT в mysql

  2. как да коригирате недефинирана променлива:сътрудници в domPDF в Laravel

  3. Просто рекурсивно дърво в PHP / MySQL

  4. #1115 - Неизвестен набор от знаци:'utf8mb4'

  5. MySQL Заключване на ниво ред