SQL Количество серверов и групповая спецификация c Вопрос - PullRequest
0 голосов
/ 10 апреля 2020

Существует таблица courses со столбцами: student и class

Нам нужно перечислить все классы, в которых учится более или равно 5 ученикам.

Для Например, таблица:

+---------+------------+
| student | class      |
+---------+------------+
| A       | Math       |
| B       | English    |
| C       | Math       |
| D       | Biology    |
| E       | Math       |
| F       | Computer   |
| G       | Math       |
| H       | Math       |
| I       | Math       |
+---------+------------+

Мой ответ:

select class from
(
select class, count(distinct class) as number 
from courses
group by class
) as classandnumber
where number > 5 or number = 5

И правильный ответ:

SELECT
    class
FROM
    (SELECT
        class, COUNT(DISTINCT student) AS num
    FROM
        courses
    GROUP BY class) AS temp_table
WHERE
    num >= 5

А теперь у меня 2 вопроса:

  1. Почему мы должны считать ученика, а не класс? Я думаю, что моя логика c также верна: подсчитывать частоту каждого класса, чтобы узнать, сколько раз этот класс выбран, что равняется количеству людей в этом классе.
  2. Почему необходимо различение? Как ученик А может посещать занятия по математике дважды?

Ответы [ 3 ]

2 голосов
/ 10 апреля 2020

Чтобы ответить на ваши вопросы - в обратном порядке:

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

1 - Когда вы группируете по class, вы подсчитываете все значения поля, которые имеют одинаковое значение class. Если вы COUNT(DISTINCT class), то это число будет равно 1 (поскольку только 1 класс имеет такое же значение class). Таким образом, вам нужно посчитать student значения вместо этого, чтобы найти число student значений с этим конкретным class значением.

Обратите внимание, что подзапрос не нужен, тест COUNT может быть расположен в HAVING предложение:

SELECT class
FROM courses
GROUP BY class
HAVING COUNT(DISTINCT student) >= 5

Демонстрация по SQLFiddle

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

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

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

Отдельные логи c не должны быть необходимыми, при условии, что данный ученик может быть связан с данным классом только один раз:

SELECT class
FROM courses
GROUP BY class
HAVING COUNT(*) > 5;

Обратите внимание, что вам также не нужен подзапрос. Если данный ученик может быть связан с одним и тем же классом более одного раза, вы должны использовать различное количество в предложении HAVING:

SELECT class
FROM courses
GROUP BY class
HAVING COUNT(DISTINCT student) > 5;
...