loading..
Русский    English
23:33
листать

Упражнение 77

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

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

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

Консоль
Выполнить
  1. SELECT MAX(superden.qty), superden.date
  2.   FROM
  3.     (SELECT COUNT(den.trip_no) AS qty, den.date
  4.        FROM
  5.          (SELECT DISTINCT trip_no, date FROM Pass_in_trip) AS den,
  6.             Trip WHERE trip.trip_no=den.trip_no AND
  7.             trip.town_from='Rostov'
  8.        GROUP BY den.date) AS superden
  9.     GROUP BY superden.date;

Подзапрос

Консоль
Выполнить
  1. 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 строки.

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

Решить задачу на SQL-EX.RU

Bookmark and Share
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INNER JOIN insert INTERSECT IS NOT NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker MAX MIN Больше тэгов
Учебник обновлялся
несколько дней назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100