Я думаю, что дополнительный вопрос, основанный на проблеме от HackerRank, и задаюсь вопросом, возможно ли решить с помощью SQL.

Пример ввода

Допустим, в CITY есть четыре записи: DEFG, ABC, PQRSER и WXY.

Пример вывода

ABC 3
DEFG 4
PQRSER 6

Мне было интересно, могу ли я использовать SQL для упорядочения длины города и названия города в алфавитном порядке с соответствующей длины. И если есть варианты для города одинаковой длины (например, ABC, WXY), я просто хочу выбрать первое название города, потому что оно идет первым по алфавиту. Спасибо!

1
SY. 2 Мар 2018 в 07:12

4 ответа

Лучший ответ

Я думаю, что вам нужна агрегация здесь по длине. Приведенный ниже подзапрос определяет алфавитное имя для каждой длины символа города. Затем мы присоединяемся к этому подзапросу, чтобы оставить нам названия городов, которые мы хотим, упорядоченные по возрастанию по длине.

SELECT t1.*
FROM yourTable t1
INNER JOIN
(
    SELECT MIN(city) AS first_city
    FROM yourTable
    GROUP BY CHAR_LENGTH(city)
) t2
    ON t1.city = t2.first_city
ORDER BY
    CHAR_LENGTH(t1.city);

демонстрация

Примечание. Если вы на самом деле просто хотите указать названия городов, вам будет достаточно:

SELECT MIN(city) AS first_city, CHAR_LENGTH(city) AS length_city
FROM yourTable
GROUP BY CHAR_LENGTH(city)
ORDER BY CHAR_LENGTH(city)

Но в реальной жизни, как правило, вы хотите вернуть всю запись обратно, и в этом случае мой первый запрос - лучший вариант.

1
Tim Biegeleisen 3 Мар 2018 в 00:39

Вы можете просто достичь результата с помощью подзапроса и агрегации.

В MySQL

SELECT * FROM
(SELECT *, LENGTH(city) cityLength
FROM test
ORDER BY LENGTH(city), city) A
GROUP BY cityLength;

См. DEMO on SQL Fiddle .

0
cdaiga 2 Мар 2018 в 04:34
SELECT CITYNAME, LEN(CITYNAME) AS WORDLENGTH FROM <YOUR TABLE> ORDER BY CITYNAME, LEN(CITYNAME) ASC; 
0
sarath s rajendran 2 Мар 2018 в 04:28

Конечно, просто ЗАКАЗАТЬ по длине названия города, а затем по названию города.

SELECT * FROM Table ORDER BY Length(city), city;
0
Daniel Gale 2 Мар 2018 в 04:19