Нужна помощь по SQL

12
paras
На сайте с 30.03.2005
Offline
83
1562

Нужна помощь в построении одного запроса к базе данных. Например, имеем такую таблицу:

country Count launched

Germany NULL NULL

Japan 1 1913

Japan 1 1914

Japan 1 1915

Gt.Britain 6 1916

Japan 1 1916

Gt.Britain 1 1917

USA 1 1920

USA 1 1921

Japan 1 1941

USA 3 1941

Japan 1 1942

USA 2 1943

USA 2 1944

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

Результат должен быть такой:

Japan 1 1913

USA 3 1941

Gt.Britain 6 1916

Germany NULL NULL

Кто может помочь в построении запроса?

Качественные и кликабельные баннеры. (http://www.banart.ru) Более 2-х лет на рынке. Тест: Умеете ли Вы разумно тратить деньги? (http://www.testplanet.ru/tests/start/?test=135)
B
На сайте с 14.07.2010
Offline
36
#1

Mysql: select `country`,`count`,`launched` from YOUR_table group by `country` order by `Count`

S
На сайте с 14.04.2008
Offline
60
#2

А если "в лоб"?

SELECT t1.country,t2.max_num,t1.min_year FROM

(SELECT country,count,min(year) AS min_year FROM tbl GROUP BY country,count) AS t1 INNER JOIN (SELECT country,max(count) AS max_num FROM tbl GROUP BY country) AS t2 ON t1.country=t2.country AND t1.count=t2.max_num

UPD. Блин, вместо launched написал year, ну вы поняли наверное...

UPD 2. А вот вариант покрасивее и наверное пошустрее:

SELECT t1.country,t1.count,min(t1.launched)

FROM tbl AS t1 LEFT JOIN tbl AS t2 ON t1.country=t2.country AND t1.count<t2.count

WHERE t2.count IS NULL

GROUP BY t1.country.t1.count

paras
На сайте с 30.03.2005
Offline
83
#3
seraphim:
А если "в лоб"?

SELECT t1.country,t2.max_num,t1.min_year FROM
(SELECT country,count,min(year) AS min_year FROM tbl GROUP BY country,count) AS t1 INNER JOIN (SELECT country,max(count) AS max_num FROM tbl GROUP BY country) AS t2 ON t1.country=t2.country AND t1.count=t2.max_num

UPD. Блин, вместо launched написал year, ну вы поняли наверное...

Ваш вариант почти подошел, только вот в ResultSet нет строки:

Germany NULL NULL

S
На сайте с 14.04.2008
Offline
60
#4

Берите второй вариант (добавлен выше). Он и красивее, и NULL'ы рисует...

paras
На сайте с 30.03.2005
Offline
83
#5
seraphim:
Берите второй вариант (добавлен выше). Он и красивее, и NULL'ы рисует...

Запрос не прошел проверку на доп. базе. Задание здесь, если интересно - http://sql-ex.ru/learn_exercises.php?LN=43

S
На сайте с 14.04.2008
Offline
60
#6

Интересно, почему :) См. скриншот. Данные не ваши (от балды напихал), но вроде как именно то, что нужно получаем...

UPD. Зарегистрировался, посмотрел... Может, стоило с самого начала задачу привести "как есть"? :)

jpg sql_quest.jpg
paras
На сайте с 30.03.2005
Offline
83
#7

Может и стоило, но я не думав, что возникнет проблема на добавочной таблице.

S
На сайте с 14.04.2008
Offline
60
#8

Это не проблема, а... скажем так... мысли автора теста по теме.

Суть "добавочной" таблицы в том, что они лепят туда NULL'ы, которые не оговорены в условии (следуя букве стандарта - по дефолту любое поле может быть пустым). И если в поле launched будут NULL'ы, то может случиться, что количество кораблей с "неизвестным годом" будет для какой-то страны наибольшим (так работает группировка).

И автор теста считает, что с точки зрения предметной области это логическая ошибка, и нужно чекать таблицу ships на null'ы в поле launched при объединении и группировке по году. Но это на самом деле вопрос спорный.

Что лучше: не увидеть битых данных или увидеть их и принять решение о степени доверия им отдельно? Я бы выбрал второе, хотя автор считает, что правильно - первое.

paras
На сайте с 30.03.2005
Offline
83
#9

seraphim, можете еще подсказать, как решить проблему, как хочет автор?

S
На сайте с 14.04.2008
Offline
60
#10

Покажите запрос, которым вы исходные данные привели к таблице, приведенной в первом сообщении темы.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий