Использование Mysql для подсчета количества оценок - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть таблица, как показано ниже. Я пытаюсь получить оценку, самые высокие показатели, достигнутые в этом классе, и учащегося, который получил такое высокое число.

name    first_term_grade       number
std1       A                     10
std2       B                      8
std3       A                      6
std1       B                      1
std2       C                      3
std3       B                      2
std1       C                      0
std2       A                      1
std3       C                      2

Целевой результат показан ниже.

grade     max_numbers    studentname
A            10          std1
B             8          std2
C             3          std2 

I am using MySQL but can't find a way around this. Can someone please put me through.

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Если вы используете версию менее SQL 8, то:

select sq.*, the_table.name as studentname from (
  select first_term_grade as grade, max(number) as max_numbers
  from the_table
  group by first_term_grade
) sq
join the_table on sq.grade = the_table.first_term_grade and sq.max_numbers = the_table.number
order by sq.grade
;

| grade | max_numbers | studentname |
| ----- | ----------- | ----------- |
| A     | 10          | std1        |
| B     | 8           | std2        |
| C     | 3           | std2        |

Просмотр на скрипте БД

Обратите внимание, что могут быть связи , т.е. более одного ученика с одинаковым классом и max_numbers.

| grade | max_numbers | studentname |
| ----- | ----------- | ----------- |
| A     | 10          | std1        |
| A     | 10          | std4        |
| B     | 8           | std2        |
| C     | 3           | std2        |

Посмотреть на БД Fiddle

1 голос
/ 03 апреля 2020

В MySQL 8+, ROW_NUMBER() делает это простым:

SELECT first_term_grade AS grade, number AS max_numbers, name AS studentname
FROM
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY first_term_grade ORDER BY number DESC) rn
    FROM yourTable
) t
WHERE rn = 1
ORDER BY grade;

В приведенном выше запросе предлагается сохранить по одной строке для каждой буквенной оценки, имеющей наибольшее значение числа.

...