Как и в случае любого сложного запроса SQL, секрет состоит в том, чтобы разбить его на части, предпочтительно независимо проверяемые части.
Первая проблема состоит в том, чтобы установить количество билетов, которое было у каждой машины за рассматриваемый период. Какой критерий здесь? Вероятно, если у машины возникла проблема, которая началась в ноябре 2011 года и продлилась до декабря 2011 года, это следует учитывать; аналогично, если проблема была начата в январе 2012 года, но была решена в феврале 2012 года, это следует учитывать. Итак, нам нужно:
SELECT machine_name, COUNT(*) AS num_tickets
FROM tickets
WHERE date_completed >= '01-Dec-2011' AND date_submitted <= '31-Jan-2012'
GROUP BY machine_name;
Если вы решили, что учитываются только даты, когда были поданы заявки, откорректируйте критерий для ссылки date_submitted
дважды; аналогично, если учитываются только даты, когда билеты были заполнены, то дважды укажите date_completed
. Обратите внимание, что если у машины был тикет, который был запущен в ноябре и не был решен до февраля, запрос выше будет его учитывать; если вы используете одну из альтернатив, то у этой машины не было проблем в течение рассматриваемого периода.
Это говорит нам, сколько билетов было открыто для машины за период времени. Теперь нам нужно определить, какое количество билетов является максимальным:
SELECT MAX(num_tickets) AS max_tickets
FROM (SELECT machine_name, COUNT(*) AS num_tickets
FROM tickets
WHERE date_completed >= '01-Dec-2011' AND date_submitted <= '31-Jan-2012'
GROUP BY machine_name
);
Теперь нам нужно выбрать имена машин, у которых было такое количество билетов:
SELECT machine_name
FROM (SELECT MAX(num_tickets) AS max_tickets
FROM (SELECT machine_name, COUNT(*) AS num_tickets
FROM tickets
WHERE date_completed >= '01-Dec-2011' AND date_submitted <= '31-Jan-2012'
GROUP BY machine_name
)
) AS n
JOIN (SELECT machine_name, COUNT(*) AS num_tickets
FROM tickets
WHERE date_completed >= '01-Dec-2011' AND date_submitted <= '31-Jan-2012'
GROUP BY machine_name
) AS m
ON n.max_tickets = m.num_tickets;
Предполагая, что Oracle поддерживает предложение WITH, это можно упростить (значительно):
WITH t AS
(SELECT machine_name, COUNT(*) AS num_tickets
FROM tickets
WHERE date_completed >= '01-Dec-2011' AND date_submitted <= '31-Jan-2012'
GROUP BY machine_name
)
SELECT t.machine_name
FROM t
JOIN (SELECT MAX(num_tickets) AS max_tickets FROM t) AS m
ON t.num_tickets = m.max_tickets;
Предупреждение : Я использовал псевдоним AS в подзапросах, как это поддерживается стандартом SQL. Я считаю, что Oracle не допускает «псевдоним AS» и требует только «псевдоним» после имен таблиц; Я не уверен, относится ли это также к именам для подзапросов. Если нотации «AS m» и «AS n» вызывают проблемы, попробуйте сбросить AS. Вы можете найти аналогичную проблему с переименованием столбца «AS num_tickets» и т. Д., Но я считаю, что Oracle разрешает использование AS в этом контексте.
Предположительно, это только один из серии вопросов, поскольку для ответа, похоже, не требуется никаких таблиц, кроме таблицы Билеты. Предположительно, другие вопросы требуют использования других таблиц.