Mysql запрос, чтобы получить максимальный возраст по разделам, и если два или более имеют одинаковый возраст, верните ученика с наименьшим идентификатором - PullRequest
0 голосов
/ 15 октября 2018

У меня есть таблица студентов с временными значениями теста, такими как:

Таблица студентов

+----+-------------+-------+-----------+
| id | section_id  |  age  | name      |
+----+-------------+-------+-----------+
| 1  | 1           | 18    | Justin    |
+----+-------------+-------+-----------+
| 2  | 2           | 14    | Jillian   |
+----+-------------+-------+-----------+
| 3  | 2           | 16    | Cherry    |
+----+-------------+-------+-----------+
| 4  | 3           | 19    | Ronald    |
+----+-------------+-------+-----------+
| 5  | 3           | 21    | Marie     |
+----+-------------+-------+-----------+
| 6  | 3           | 21    | Arthur    |
+----+-------------+-------+-----------+

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

Return:

+----+------------+-----+--------+
| id | section_id | age | name   |
+----+------------+-----+--------+
| 1  | 1          | 18  | Justin |
+----+------------+-----+--------+
| 3  | 2          | 16  | Cherry |
+----+------------+-----+--------+
| 5  | 3          | 21  | Marie  |
+----+------------+-----+--------+

Я пробовал этот запрос:

SELECT ANY_VALUE(id), ANY_VALUE(section_id), MAX(age), ANY_VALUE(name) FROM
(SELECT id, section_id, age, name FROM students ORDER BY id) as X
GROUP BY section_id

К сожалению, есть случаи, когда id не совпадает с возрастом и именем.

У меня на конце есть:

sql_mode = only_full_group_by

, и я не имею права редактировать это,следовательно, функция any_value, но я понятия не имею, как ее использовать.

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Я бы просто использовал коррелированный подзапрос:

select s.*
from students s
where s.id = (select s2.id
              from students s2
              where s2.section_id = s.section_id
              order by s2.age desc, s2.id asc
              limit 1
             );

Это довольно простой способ выразить логику.И с индексом на students(section, age, id) он также должен быть наиболее производительным.

0 голосов
/ 15 октября 2018

Это будет делать то, что вы хотите.

Начинается с определения максимального возраста для каждой секции (включая дубликаты).Затем он объединяет эти результаты с минимальным идентификатором на раздел (для устранения дубликатов).И наконец, выберите все поля для соответствующих идентификаторов и комбинаций разделов.

SELECT s3.*
FROM students s3
INNER JOIN (
    SELECT MIN(s2.id) AS id, s2.section_id
    FROM students s2
    INNER JOIN (
        SELECT s1.section_id, MAX(s1.age) AS age
        FROM students s1
        GROUP BY s1.section_id  
    ) s1 USING (section_id, age)
    GROUP BY s2.section_id
) s2 USING (id, section_id);

Рабочая скрипта SQL: https://www.db -fiddle.com / f / aezgAYM6A5KnXykceB7At1 / 0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...