SQL-запрос для поиска самого длинного имени и кратчайшего имени в таблице
У меня есть таблица с одним из столбцов типа varchar (city). и хотите найти самый длинный и самый короткий из значений, хранящихся в этом столбце.
Может ли кто-нибудь помочь? Благодаря
ОТВЕТЫ
Ответ 1
Я не думаю, что нам нужно использовать функции Min и Max и Group by также не требуется.
Мы можем достичь этого, используя приведенный ниже код:
, но в этом случае он отобразит вывод в 2 таблице, и если мы хотим объединить в одну таблицу, мы можем использовать Union или Union ALL. Ниже приведен запрос SQL для того же
здесь я вставляю выражение select внутри подзапроса, потому что, когда мы используем предложение order by, мы не можем использовать Union или Union ALL напрямую, поэтому я написал его внутри подзапроса.
Ответ 2
Это работает для проблемы с вызовом HackerRank (MS SQL Server).
Ответ 3
Может быть, более простой вариант, так как я полагаю, что вы ищете помощь в решении вопроса о хакерском ранце? Добавление лимитов упростило для меня отладку, где проблема была с возвращенной ошибкой.
Ответ 4
Для запроса требуется всего несколько настроек. Основная проблема заключается в том, что вы не можете использовать a в подзапросе, как вы это делаете:
Тем не менее, более простой способ написать запрос:
Ответ 5
В MySQL
Ответ 6
Это подход с CTE. Сначала он находит самый длинный и самый короткий, чем соответствующие города:
Ответ 7
Я сделал это в SQL Server, используя CTE и функцию dense_rank. Как работает рейтинг?
Первый раздел (группы форм) по длине, т.е. те же длины образуют группу (раздел). Затем упорядочьте все имена в алфавитном порядке в каждом разделе. Затем назначьте ранги (столбцы dRank) в каждом разделе. Таким образом, ранг 1 в каждой группе будет назначен именам, которые в алфавитном порядке отображаются сначала в соответствующем разделе. Все это происходит в общем табличном выражении (cte block)
Ответ 8
Изначально нахождение кратчайшей длины city и объединение с самой длинной длиной city . Это минимизирует сложность запроса.
Ответ 9
Протестировано в SQL Server 2016
Ответ 10
Ответ 11
Ответ 12
В Oracle (и любом другом языке, который поддерживает аналитические функции), используя аналитическую функцию ROW_NUMBER , вы можете назначить строки уникальным число согласно ASC завершено (или DESC завершено) длина города. Так как может быть несколько строк с одинаковой длиной, тогда вторичный порядок может быть применен для получения первого города этой длины в алфавитном порядке. Тогда вам понадобится внешний запрос для фильтрации результатов только для кратчайшего (или самого длинного) имени:
Если вы хотите вернуть все города с самым коротким (или самым длинным) именем, используйте DENSE_RANK вместо ROW_NUMBER :
Ответ 13
В Oracle 12c это можно сделать, используя FETCH..FIRST
Ответ 14
Ответ 15
Следующий запрос кажется достаточно простым:
1-й запрос внутри возвращает город с минимальной длиной, а 2-й запрос возвращает город с максимальной длиной.
Надеюсь это поможет.
Ответ 16
Для кратчайшего названия города:
Для самого длинного названия города:
Ответ 17
В Oracle это было бы,
Ответ 18
Этот запрос будет хорошо работать в ваших условиях, эти 2 запроса точно такие же. В первом запросе мы просто упорядочиваем запись в порядке убывания, чтобы взять название города с наибольшей длиной, а во второй части мы просто записываем записи в порядке возрастания, чтобы взять город с минимальной длиной, все остальные запросы одинаковы. Кидни, посмотри.
Деталь:
- Выберите выписку, чтобы убрать записи
- Используйте group by, потому что я использую функцию агрегирования Len().
Упорядочивание всех найденных записей в порядке убывания и возрастания, чтобы получить верхнюю 1 и взять город максимальной и минимальной длины.
SQL-запрос для поиска самого длинного имени и самого короткого имени в таблице
У меня есть таблица с одним из столбцов типа varchar(город). и хотите найти самые длинные и короткие значения, хранящиеся в этом столбце.
Кто-нибудь может помочь? Спасибо
Одно из решений:
34 ответа
Я не думаю, что нам нужно использовать функции Min и Max, а Group by также не требуется.
Мы можем достичь этого, используя следующий код:
но в этом случае он отобразит вывод в 2 таблицах, и если мы хотим объединить в одну таблицу, мы можем использовать Union или Union ALL. Ниже приведен SQL-запрос для того же
здесь я вкладываю инструкцию select в подзапрос, потому что когда мы используем предложение order by, мы не можем использовать Union или Union ALL напрямую, поэтому я написал его в подзапросе.
Это работает для проблемы вызова HackerRank (MS SQL Server).
В MySQL
Может быть, более простой вариант, так как я полагаю, что вы ищете помощь в решении вопроса о рейтинге Хакера? Добавление лимитов облегчило мне отладку, когда проблема была с возвращенной ошибкой.
Ваш запрос требует всего несколько настроек. Основная проблема заключается в том, что вы не можете использовать a в подзапросе, как вы делаете:
Тем не менее, более простой способ написать запрос:
Это еще один способ сделать это в MySQL. Может быть, не самый лучший, но логически верный вариант.
Это подход с CTE. Сначала он находит самый длинный и самый короткий, чем соответствующие города:
Первоначально найти самую короткую длину city и принимая союз с самой длинной длиной city , Это минимизирует сложность запроса.
Я сделал это в SQL Server, используя функции CTE и dens_rank. Как работает рейтинг?
Первый раздел (формы групп) по длинам, то есть одинаковые длины составляют группу (раздел). Затем упорядочите все имена в алфавитном порядке в каждом разделе. Затем назначьте ранги (столбец dRank) в каждом разделе. Таким образом, ранг 1 в каждой группе будет присвоен именам, которые в алфавитном порядке появляются первыми в соответствующем разделе. Все это происходит в общем табличном выражении (блок cte)
Я использовал предложение WITH для Oracle, чтобы сохранить самые короткие / самые длинные имена во временной переменной, а не выполнять запросы внутри основного предложения from.Пример предложения SQL WITH
Протестировано в SQL Server 2016
Для кратчайшего названия города: ВЫБЕРИТЕ ST.CITY, ДЛИНУ (ST.CITY) КАК ДЛИНА ОТ СТАНЦИИ ST ЗАКАЗ ДЛИНОЙ ASC, ST.CITY ASC LIMIT 1;
Для самого длинного названия города: ВЫБЕРИТЕ ST.CITY, ДЛИНУ (ST.CITY) КАК ДЛИНА ОТ СТАНЦИИ ST ЗАКАЗ ПО ДЛИНЕ DESC, ST.CITY DESC LIMIT 1;
Вот решение, которое строго использует MIN и MAX
Концепция здесь заключается в применении к длине названия города. В пределах этих результатов снова применить MIN к самому названию города , чтобы найти первый по алфавиту.
Конечно, используйте MAX таким же образом найти максимальную длину города и выполнить UNION из двух запросов для окончательного решения.
Никаких сортов, ASC , DESC , LIMIT , или же ORDER BY нужный.
В дополнение ко всем ответам выше, я хочу поделиться трюком, который я использовал в T-SQL, но он существует в любой версии:
- Я вычисляю длину с ведущими 0 колодками, которые позволяют сортировать по алфавиту
- В этом примере я предполагаю, что весь текст будет меньше 10 МБ, поэтому максимум 7-значное число
- REPLACE(STR(CAST(LEN(city) AS INT) ,7), SPACE(1), ‘0’)
- Я добавляю 0-дополненный LEN() к стоимости
- concat( <step1> , city )
- я выбираю MAX() или MIN()
- Это работает, потому что число, дополненное 0, может быть отсортировано в алфавитном порядке.
- Пример: «099» < «100» , но «99» > «100» потому что «9» > «1» в ascii)
- Я удаляю число из значения
- STUFF( <step 3> ,1,7,») поскольку мы заменяем 7 первых символов на », и наш номер всегда будет состоять из 7 символов из-за заполнения 0
Наконец, следующий SQL вернет оба ответа в одном запросе, без окон и без объединений:
Это также позволяет вам получить минимальную максимальную информацию из любого другого столбца (в той же строке), например столбца «station_ranking», если он существует.
Вот пример dbfiddle с MySQL:
Следующий запрос кажется достаточно простым:
1-й запрос внутри возвращает город с минимальной длиной, а 2-й запрос возвращает город с максимальной длиной.
Надеюсь это поможет.
Это работает для mysql
В Oracle это было бы,
Этот запрос будет хорошо работать в ваших условиях, эти 2 запроса точно такие же. В первом запросе мы просто упорядочиваем запись в порядке убывания, чтобы взять название города с наибольшей длиной, а во второй части мы просто записываем записи в порядке возрастания, чтобы взять город с минимальной длиной, все остальные запросы одинаковы. Кидни, погляди.
Деталь:
- Выберите заявление, чтобы вынуть записи
- Используйте group by, потому что я использую функцию агрегирования Len().
Упорядочивание всех найденных записей в порядке убывания и возрастания, чтобы получить верхнюю 1 и взять максимальную и минимальную длину города.
Выберите город, длина (город) из (выберите город, длина (город), ранг () над (разделение по длине (город), порядок по длине (город), город по возрастанию) как rnk от станции) a, где a.rnk=1;
В Oracle мы можем сделать вот так
Идея состоит в том, чтобы получить самый длинный и самый короткий город, а затем объединить их в один результат.
Для Oracle SQL в одной результирующей таблице. Это позволит получить минимальное и максимальное названия городов, и, если они имеют одинаковую длину, первый город будет отсортирован в алфавитном порядке.
В Oracle (и любом другом языке, который поддерживает аналитические функции), используя ROW_NUMBER Аналитическая функция позволяет назначать строки уникальный номер в соответствии с ASC окончание (или DESC окончание) длина города. Поскольку может быть несколько строк одинаковой длины, можно применить вторичный порядок, чтобы получить первый город этой длины в алфавитном порядке. Тогда все, что вам нужно, это внешний запрос, чтобы отфильтровать результаты только по самому короткому (или самому длинному) имени:
Если вы хотите вернуть все города с самым коротким (или самым длинным) названием, используйте DENSE_RANK вместо ROW_NUMBER :
How to find longest string in the table column data
![]()
Note that this will only return one value if there are multiple with the same longest length.
Having just recieved an upvote more than a year after posting this, I’d like to add some information.
- This query gives all values with the maximum length. With a TOP 1 query you get only one of these, which is usually not desired.
- This query must probably read the table twice: a full table scan to get the maximum length and another full table scan to get all values of that length. These operations, however, are very simple operations and hence rather fast. With a TOP 1 query a DBMS reads all records from the table and then sorts them. So the table is read only once, but a sort operation on a whole table is quite some task and can be very slow on large tables.
- One would usually add DISTINCT to my query ( SELECT DISTINCT CR FROM . ), so as to get every value just once. That would be a sort operation, but only on the few records already found. Again, no big deal.
- If the string lengths have to be dealt with quite often, one might think of creating a computed column (calculated field) for it. This is available as of Ms Access 2010. But reading up on this shows that you cannot index calculated fields in MS Access. As long as this holds true, there is hardly any benefit from them. Applying LEN on the strings is usually not what makes such queries slow.
This was the first result on «longest string in postgres» google search so I’ll put my answer here for those looking for a postgres solution.
SELECT max(char_length(column)) AS Max_Length_String FROM table
You can get it like this:
but i’m sure, there is a more elegant way to do it
This will give you the string itself,modified for postgres from @Thorsten Kettner answer
SQL-запрос для поиска самого длинного и самого короткого имени в таблице
У меня есть таблица с одним из столбцов типа varchar(city). и хотите найти самое длинное и самое короткое из значений, хранящихся в этом столбце.
Кто-нибудь может помочь? Благодарность
31 ответ
Это работает для проблемы с вызовом HackerRank (MS SQL Server).
В MySQL
Может быть, более простой вариант, так как я предполагаю, что вы ищете помощь в решении вопроса о Hacker Rank? Добавление лимитов упростило отладку проблемы, связанной с возвращаемой ошибкой.
Ваш запрос требует всего несколько настроек. Основная проблема заключается в том, что вы не можете использовать a в подзапросе, как вы это делаете:
Тем не менее, более простой способ написать запрос:
Я сделал это в SQL Server, используя CTE и функцию плотности_ранка. Как работает рейтинг?
Сначала разбейте (сформируйте группы) по длинам, т.е. одинаковые длины составляют группу (раздел). Затем расположите все имена в алфавитном порядке в каждом разделе. Затем назначьте ранги (столбец dRank) в каждом разделе. Таким образом, ранг 1 в каждой группе будет присвоен именам, которые в алфавитном порядке появляются первыми в соответствующем разделе. Все это происходит в общем табличном выражении (блоке cte)
В Oracle (и любом другом языке, поддерживающем аналитические функции) с помощью ROW_NUMBER можно присвоить строкам уникальный номер в соответствии с ASC конечной (или DESC конечной) длиной города. Поскольку может быть несколько строк одинаковой длины, можно применить вторичный порядок, чтобы получить первый город такой длины в алфавитном порядке. Тогда все, что вам нужно, это внешний запрос для фильтрации результатов только по самому короткому (или самому длинному) имени:
Если вы хотите вернуть все города с самым коротким (или самым длинным) названием, используйте DENSE_RANK вместо ROW_NUMBER :
Я использовал предложение WITH для Oracle, чтобы сохранить самые короткие/длинные имена во временной переменной, а не запрашивать внутри основного предложения «от». Пример предложения SQL WITH