Книги и статьи по SQL Rambler's Top100 Switch language to: English 14 июля 2020 г. 19:38:13


www.sql-ex.ru
Skip Navigation Links  

 

Print  Версия для печати

На главную страницу

Характерные ошибки при решении упражнений. Задача 33

Моисеенко С.И.

Определить дни, когда было выполнено максимальное число рейсов из Ростова ('Rostov'). Вывод: число рейсов, дата.

Мне казалось, что формулировка предельно понятна. Тем более, что когда эта задача еще находилась на втором этапе, она не вызывала никаких вопросов. Однако сказалась разница в классе :) . Отвечать на аналогичные вопросы приходилось столь часто, что мне пришлось написать этот FAQ.

Вот типичный пример неправильного запроса:

SELECT MAX(superden.qty), superden.date
  FROM
    (SELECT COUNT(den.trip_no) AS qty, den.date
       FROM
         (SELECT DISTINCT trip_no, date FROM Pass_in_trip) as den, 
            Trip WHERE trip.trip_no=den.trip_no AND
            trip.town_from='Rostov'
       GROUP BY den.date) AS superden
    GROUP BY superden.date

Подзапрос

SELECT DISTINCT trip_no, date FROM Pass_in_trip

определяет совершенные рейсы. DISTINCT здесь вполне уместен, т.к. для пассажиров, летевших в одном самолете, комбинация {trip_no, date} совпадает. Подзапрос соединяется с таблицей Trip, чтобы отобрать только ростовские рейсы: trip.town_from='Rostov'.

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

Кажется, что таким образом автор решения пытался найти максимум, но получил тот же самый набор. Пусть распределение количества по датам будет таким:

2007-08-19     2
2007-08-20     2
2007-08-21     3

По условию задачи мы должны получить лишь одну строку:

2007-08-21     3

т.к. максимальное значение числа полетов – 3 – достигается 2007-08-21, но в результате последней группировки по дате мы получим те же самые 3 строки.

Надеюсь, что теперь понятно, как следует решать эту задачу, и мне не придется больше отвечать на письма по этому поводу :) .

Перейти к решению задачи #33

На главную страницу

Print  Версия для печати


Использование любых материалов данного сайта возможно только
при условии обязательного размещения прямой ссылки на сайт
http://www.sqlbooks.ru
на каждой странице, где размещены используемые материалы.

 Начало   Статьи    Книги 
Рейтинг@Mail.ru Rambler's Top100 Alt Упражнения по SQL: обучение, тестирование, сертификация по языку SQL Copyright c 2002-2006. All rights reserved.