- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Переиграть и победить: как анализировать конкурентов для продвижения сайта
С помощью Ahrefs
Александр Шестаков
В 2023 году Одноклассники пресекли более 9 млн подозрительных входов в учетные записи
И выявили более 7 млн подозрительных пользователей
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Нужна помощь в построении одного запроса к базе данных. Например, имеем такую таблицу:
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
Кто может помочь в построении запроса?
Mysql: select `country`,`count`,`launched` from YOUR_table group by `country` order by `Count`
А если "в лоб"?
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
А если "в лоб"?
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
Берите второй вариант (добавлен выше). Он и красивее, и NULL'ы рисует...
Берите второй вариант (добавлен выше). Он и красивее, и NULL'ы рисует...
Запрос не прошел проверку на доп. базе. Задание здесь, если интересно - http://sql-ex.ru/learn_exercises.php?LN=43
Интересно, почему :) См. скриншот. Данные не ваши (от балды напихал), но вроде как именно то, что нужно получаем...
UPD. Зарегистрировался, посмотрел... Может, стоило с самого начала задачу привести "как есть"? :)
Может и стоило, но я не думав, что возникнет проблема на добавочной таблице.
Это не проблема, а... скажем так... мысли автора теста по теме.
Суть "добавочной" таблицы в том, что они лепят туда NULL'ы, которые не оговорены в условии (следуя букве стандарта - по дефолту любое поле может быть пустым). И если в поле launched будут NULL'ы, то может случиться, что количество кораблей с "неизвестным годом" будет для какой-то страны наибольшим (так работает группировка).
И автор теста считает, что с точки зрения предметной области это логическая ошибка, и нужно чекать таблицу ships на null'ы в поле launched при объединении и группировке по году. Но это на самом деле вопрос спорный.
Что лучше: не увидеть битых данных или увидеть их и принять решение о степени доверия им отдельно? Я бы выбрал второе, хотя автор считает, что правильно - первое.
seraphim, можете еще подсказать, как решить проблему, как хочет автор?
Покажите запрос, которым вы исходные данные привели к таблице, приведенной в первом сообщении темы.