Как распечатать таблицу MySQL, которая подсчитывает количество дисков на три верхних драйвера? - PullRequest
0 голосов
/ 31 марта 2019

ПРОБЛЕМА:

Рассмотрим таблицу с именем drives со следующими столбцами:

drive_id, driver_id, date_time, start_state, end_state

Каждая строка - это переход из одного состояния в другое в определенный день для данного драйвера.

Для 3 драйверов, которые выполнили большинство дисков, напишите запрос, который печатает таблицу, в которой подсчитывается количество дисков на драйвер по значениям start_state и end_state.

Выходные данные должны иметь столбцы:

start_state, end_state, driver_id, n_drives

Ниже приведен код, который я пробовал:

SELECT
    start_state,
    end_state,
    driver_id,
    COUNT(*) AS n_drives
FROM drives
JOIN (
    SELECT
        COUNT(*) AS drive_counts,
        driver_id
    FROM drives
    ORDER BY drive_counts DESC
    LIMIT 3
) AS top_three_drivers USING (driver_id)
GROUP BY start_state, end_state, driver_id;

Вот как должна выглядеть таблица:

NY | PA | driver_4 | 1
PA | OH | driver_3 | 2
NY | NY | driver_5 | 2
OH | PA | driver_3 | 5
OH | NY | driver_4 | 1

1 Ответ

0 голосов
/ 31 марта 2019

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

Дано

drop table if exists t;
create table t
(drive_id int, driver_id int, date_time date, start_state varchar(1), end_state varchar(1));

insert into t values
(1,1,'2019-03-31','a','b'),
(1,1,'2019-03-31','a','b'),
(1,1,'2019-03-31','b','c'),
(1,2,'2019-03-31','a','b'),
(1,2,'2019-03-31','a','b'),
(1,3,'2019-03-31','a','b'),
(1,3,'2019-03-31','a','b'),
(1,4,'2019-03-31','a','b');

Подзапрос

SELECT
    COUNT(*) AS drive_counts,
    driver_id
FROM t
ORDER BY drive_counts DESC
LIMIT 3 

Возвращает

+--------------+-----------+
| drive_counts | driver_id |
+--------------+-----------+
|            8 |         1 |
+--------------+-----------+
1 row in set (0.00 sec)

Исправление подзапроса для группировки по идентификатору водителя (и вывод дурного с помощью предложения в пользу объединения)

SELECT
    start_state,
    end_state,
    t.driver_id,
    COUNT(*) AS n_drives
FROM t
JOIN (
    SELECT
        COUNT(*) AS drive_counts,
        driver_id
    FROM t
    group by driver_id
    ORDER BY drive_counts DESC
    LIMIT 3
) AS top_three_drivers on top_three_drivers.driver_id = t.driver_id
GROUP BY start_state, end_state, t.driver_id
order by t.driver_id,start_state;

Результат в

+-------------+-----------+-----------+----------+
| start_state | end_state | driver_id | n_drives |
+-------------+-----------+-----------+----------+
| a           | b         |         1 |        2 |
| b           | c         |         1 |        1 |
| a           | b         |         2 |        2 |
| a           | b         |         3 |        2 |
+-------------+-----------+-----------+----------+
4 rows in set (0.00 sec)

Что я и ожидал.Кстати, вопрос плохой, поскольку он не учитывает ничьи - в этом примере драйверы 2 и 3 имеют одинаковое количество дисков, поэтому, возможно, также должен появиться драйвер 4.

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