#mysql #sql
#mysql #sql
Вопрос:
Почему мой запрос неверен?
SELECT MIN(city), LENGTH(MIN(city))
FROM station
ORDER BY MIN(city) ASC
LIMIT 1;
SELECT MAX(city), LENGTH(MAX(city))
FROM station
ORDER BY MAX(city) ASC
LIMIT 1;
Формулировка вопроса:
Запросите два города на СТАНЦИИ с самыми короткими и самыми длинными названиями ГОРОДОВ, а также их соответствующую длину (т. Е. количество символов в названии). Если существует более одного самого маленького или самого большого города, выберите тот, который идет первым при заказе в алфавитном порядке.
Пример ввода
Например, CITY содержит четыре записи:
CITY
----
DEF
ABC
PQRS
WXY
Пример вывода
ABC 3
PQRS 4
Объяснение
При упорядочении в алфавитном порядке названия ГОРОДОВ перечислены как ABC, DEF, PQRS и WXY с длинами и . Самое длинное имя — PQRS, но есть варианты для города с самым коротким именем. Выберите ABC, потому что он идет первым в алфавитном порядке.
Обратите внимание, что вы можете написать два отдельных запроса, чтобы получить желаемый результат. Это не обязательно должен быть один запрос.
Комментарии:
1. какая версия mysql?
2. @forpas откатил вашу правку, потому что вы изменили пример вывода с возможно наличия 1 строки на наличие 2 строк
3. Ни одного конкретного. Это упражнение на хакерство.
4. @forpas неважно, по-видимому, вы были правы: hackerrank.com/challen&es/weather-observation-station-5/problem
Ответ №1:
MIN(city)
является лексически минимальным городом. Таким образом, учитывая «Ахен» и «Дувр», это будет «Ахен». И LENGTH(MIN(city))
— длина этого города, поэтому 6, а не 5.
Чтобы получить самое короткое название города, вам нужно что-то вроде:
select min(city), len&th(city)
from station
&roup by len&th(city)
order by len&th(city)
limit 1;
Путем группировки по длине min(city)
будет найдено лексически наименьшее название города для каждой длины.
Аналогично, для самого длинного имени:
select min(city), len&th(city)
from station
&roup by len&th(city)
order by len&th(city) desc
limit 1;
(по-прежнему выбирается лексически первое название города для каждой длины, но порядок по убыванию длины вместо возрастания длины).
Получить оба в одном запросе проще всего с помощью оконных функций (требуется mysql 8.0 или mariadb 10.2 или выше):
select
first_value(city) over minlen,
first_value(len&th(city)) over minlen,
first_value(city) over maxlen,
first_value(len&th(city)) over maxlen
from station
window
minlen as (order by len&th(city),city),
maxlen as (order by len&th(city) desc,city)
limit 1;
В более ранних версиях проще всего сделать это следующим образом:
select
substr(min(concat(lpad(len&th(city),8,0),city)),9),
min(len&th(city)),
substr(min(concat(99999999-len&th(city),city)),9),
max(len&th(city))
from station;
(который может показаться более простым запросом, но не сможет использовать индекс для города).
Комментарии:
1. Спасибо, спасибо. Полный ответ сработал (с MAX (city) и другим с помощью DESC) сработал.
2. Какой полный ответ? Ответ не должен включать
max(city)
, это было бы неправильно3.Представленный код, который сработал, был:
SELECT MIN(city), LENGTH(city)
FROM station
GROUP BY LENGTH(city)
ORDER BY LENGTH(city)
LIMIT 1;
SELECT MAX(city), LENGTH(city)
FROM station
GROUP BY LENGTH(city)
ORDER BY LENGTH(city) DESC
LIMIT 1;
4. потому что они запрашивают имя минимальной и максимальной длины.
5. это неверно; это вернет самое длинное название города, которое идет последним в алфавитном порядке, а не то, которое идет первым. вы хотите MIN как для самых длинных, так и для самых коротких запросов