In addition to all answers above, I want to share a trick I used in T-SQL but exist in any version:
- I calculate the length with leading 0 pads which allow alphabetic sort
- In this example, I assume all text will be less than 10MB, so 7 digit number at max
REPLACE(STR(CAST(LEN(city) AS INT) ,7), SPACE(1), '0')
- I append the 0-padded
LEN()
to the valueconcat( <step1> , city )
- I choose
MAX()
orMIN()
- This works because the 0 padded number can be sorted alphabetically.
- Example:
"099" < "100"
, but"99" > "100"
because"9" > "1"
in ascii)
- I remove the number from the value
STUFF( <step 3> ,1,7,'')
as we replace 7 firts chars with », and our number will always be 7 char long because of 0 padding
Finally, the following SQL will return both answers in the same query, without windows and without unions:
SELECT
STUFF(min(
concat(
REPLACE(STR(CAST(LEN(city) AS INT) ,7), SPACE(1), '0')
,city))
,1,7,'')
as [min_len],
STUFF(max(
concat(
REPLACE(STR(CAST(LEN(city) AS INT) ,7), SPACE(1), '0')
,city))
,1,7,'')
as [max_len]
from station
This also lets you get min max by any other info from any other column (in the same row), like «station_ranking» column if exists.
Here is a dbfiddle with MySQL example:
SELECT
SUBSTR(min(
concat(
LPAD(length(city), 7, '0')
,city))
,7+1)
as min_name_len,
SUBSTR(max(
concat(
LPAD(station_rank, 2, '0')
,city))
,2+1)
as max_name_rank
from stations
https://www.db-fiddle.com/f/76ew1fK9D5V3vopbGUuYxh/4
I’ve a table contains the columns like
Prefix | CR
----------------------------------------
g | ;#WR_1;#WR_2;#WR_3;#WR_4;#
v | ;#WR_3;#WR_4;#
j | WR_2
m | WR_1
d | ;#WR_3;#WR_4;#
f9 | WR_3
I want to retrieve data from CR column WHERE it has the longest text string i.e in current table it is ;#WR_1;#WR_2;#WR_3;#WR_4;#.
I’m using
SELECT max(len(CR)) AS Max_Length_String FROM table1
But it retuns
Max_Length_String
----------------------------------------
26
But what i need is not the length (26), i wanted like this
Max_Length_String
----------------------------------------
;#WR_1;#WR_2;#WR_3;#WR_4;#
ˈvɔlə
8,92610 gold badges63 silver badges89 bronze badges
asked Feb 19, 2014 at 15:38
The easiest way is:
select top 1 CR
from table t
order by len(CR) desc
Note that this will only return one value if there are multiple with the same longest length.
answered Feb 19, 2014 at 15:46
Gordon LinoffGordon Linoff
1.2m57 gold badges639 silver badges781 bronze badges
6
You can:
SELECT CR
FROM table1
WHERE len(CR) = (SELECT max(len(CR)) FROM table1)
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.
answered Feb 19, 2014 at 15:45
Thorsten KettnerThorsten Kettner
87.8k7 gold badges47 silver badges71 bronze badges
1
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
postgres docs: http://www.postgresql.org/docs/9.2/static/functions-string.html
answered Jan 25, 2016 at 19:37
tmthyjamestmthyjames
1,5682 gold badges22 silver badges30 bronze badges
3
You can get it like this:
SELECT TOP 1 CR
FROM tbl
ORDER BY len(CR) DESC
but i’m sure, there is a more elegant way to do it
answered Feb 19, 2014 at 15:47
xeraphimxeraphim
4,3359 gold badges51 silver badges99 bronze badges
For Postgres:
SELECT column
FROM table
WHERE char_length(column) = (SELECT max(char_length(column)) FROM table )
This will give you the string itself,modified for postgres from @Thorsten Kettner answer
answered Oct 27, 2016 at 10:07
For Oracle 11g:
SELECT COL1
FROM TABLE1
WHERE length(COL1) = (SELECT max(length(COL1)) FROM TABLE1);
answered Aug 29, 2016 at 23:22
kavehmbkavehmb
9,8021 gold badge19 silver badges22 bronze badges
With two queries you can achieve this. This is for mysql
//will select shortest length coulmn and display its length.
// only 1 row will be selected, because we limit it by 1
SELECT column, length(column) FROM table order by length(column) asc limit 1;
//will select shortest length coulmn and display its length.
SELECT CITY, length(city) FROM STATION order by length(city) desc limit 1;
answered Mar 23, 2017 at 5:46
ShobiShobi
10.1k6 gold badges43 silver badges80 bronze badges
you have to do some changes by applying group by or query with in query.
"SELECT CITY,LENGTH(CITY) FROM STATION ORDER BY LENGTH(CITY) DESC LIMIT 1;"
it will return longest cityname from city.
Dilan
2,5707 gold badges23 silver badges32 bronze badges
answered Aug 21, 2020 at 9:39
To answer your question, and get the Prefix
too, for MySQL you can do:
select Prefix, CR, length(CR) from table1 order by length(CR) DESC limit 1;
and it will return
+-------+----------------------------+--------------------+
| Prefix| CR | length(CR) |
+-------+----------------------------+--------------------+
| g | ;#WR_1;#WR_2;#WR_3;#WR_4;# | 26 |
+-------+----------------------------+--------------------+
1 row in set (0.01 sec)
answered Apr 27, 2017 at 11:04
pjammerpjammer
9,4414 gold badges45 silver badges56 bronze badges
In MySQL you can use,
(SELECT CITY,
LENGTH(CITY) AS CHR_LEN
FROM STATION
ORDER BY CHR_LEN ASC,
CITY
LIMIT 1)
UNION
(SELECT CITY,
LENGTH(CITY) AS CHR_LEN
FROM STATION
ORDER BY CHR_LEN DESC,
CITY
LIMIT 1)
David Buck
3,71335 gold badges31 silver badges35 bronze badges
answered Oct 18, 2020 at 3:48
Instead of SELECT max(len(CR)) AS Max_Length_String FROM table1
Use
SELECT (CR) FROM table1
WHERE len(CR) = (SELECT max(len(CR)) FROM table1)
answered Feb 19, 2014 at 15:48
RevanRevan
97411 silver badges25 bronze badges
SELECT w.DEPARTMENT
FROM Worker w
group by w.DEPARTMENT
order by length(w.DEPARTMENT) DESC
LIMIT 2 ;
answered Jan 8, 2022 at 17:11
Hemanth KumarHemanth Kumar
7991 gold badge6 silver badges7 bronze badges
4
In MariaDB only length
and char_length
worked for me.
If you use non-english letters, you better use char_length
.
For example:
select
e.id,
home.name,
LENGTH(home.name) as length,
CHAR_LENGTH(home.name) as char_length
from events e
left join teams home on e.home_id = home.id
order by CHAR_LENGTH(home.name) desc
answered Jan 9, 2022 at 12:59
SELECT CITY,LENGTH(CITY) FROM STATION GROUP BY CITY ORDER BY LENGTH(CITY) ASC LIMIT 1;
SELECT CITY,LENGTH(CITY) FROM STATION GROUP BY CITY ORDER BY LENGTH(CITY) DESC LIMIT 1;
double-beep
4,97617 gold badges32 silver badges41 bronze badges
answered Jun 3, 2020 at 12:02
If column datatype is text you should use DataLength function like:
select top 1 CR, DataLength(CR)
from tbl
order by DataLength(CR) desc
answered Jul 29, 2020 at 7:13
DevcaDevca
771 silver badge2 bronze badges
Introduction
In SQL Server, we can find the Longest String Value and Shortest String Value from the same table. To find the longest and shortest values, there are many ways, but in this article, we will discuss some simplest ways.
Disclaimer: From this article, I am not sharing these are the only efficient ways to query or best approach. I am sharing some simple options. If you know better ways to achieve this, please share that in our comment section.
Finding Longest & Shortest Names
Approach One
We can achieve this by writing it as two T-SQL Statement. As for this example, lets take [Details].[StudentDetails] and the column as FirstName.
SELECT [StudentId] ,[FirstName] ,[LastName] ,[RegistrationNumber] ,[Degree] ,[CreatedDate] FROM [PracticalWorks].[Details].[StudentDetails]
Now lets write T-SQL Statement to get the Longest and Shortest First Names with Length.
SELECT TOP (1) [FirstName], LEN(FirstName) AS [Length] FROM [PracticalWorks].[Details].[StudentDetails] ORDER BY [Length] DESC , FirstName SELECT TOP (1) [FirstName], LEN(FirstName) AS [Length] FROM [PracticalWorks].[Details].[StudentDetails] ORDER BY [Length] , FirstName
The above T-SQL query results as,
The first T-SQL statement, results the Longest Name and its length and the second T-SQL statement results the Shortest Name and its length.
Approach Two
From the Approach one, we got the result as two different result sets. But this can be returned in one single result set. By using a Sub-Query and UNION we can achieve it,
SELECT * FROM ( SELECT TOP (1) [FirstName], LEN(FirstName) AS [Length] FROM [PracticalWorks].[Details].[StudentDetails] ORDER BY [Length] DESC , FirstName ) AS LongestName UNION SELECT * FROM ( SELECT TOP (1) [FirstName], LEN(FirstName) AS [Length] FROM [PracticalWorks].[Details].[StudentDetails] ORDER BY [Length] , FirstName ) AS ShortestName
The above T-SQL statement results as,
Whenever we are using the ORDER BY, then we cannot directly apply the UNION Operator, so we are nesting select statements in a sub query
Conclusion
In this article, we have discussed the different approaches to finding the Largest and Shortest Names. I assume you all found this article useful. We will discuss more T-SQL concepts in upcoming articles. Please share your feedback in the comment section.
У меня есть таблица с одним из столбцов типа varchar(город). и хотите найти самые длинные и короткие значения, хранящиеся в этом столбце.
select a.city, a.city_length from (select city, char_length(city) city_length
from station order by city, city_length) a
where a.city_length = (select min(a.city_length) from a) or
a.city_length = (select max(a.city_length) from a)
group by a.city_length;
Кто-нибудь может помочь? Спасибо
Одно из решений:
select * from (select city, char_length(city) city_length from station order by city, city_length) a group by a.city_length order by a.city_length limit 1;
select * from (select city, char_length(city) city_length from station order by city, city_length) a group by a.city_length order by a.city_length desc limit 1;
2016-02-14 20:11
34
ответа
Я не думаю, что нам нужно использовать функции Min и Max, а Group by также не требуется.
Мы можем достичь этого, используя следующий код:
select top 1 City, LEN(City) City_Length from STATION order by City_Length ASC,City ASC
select top 1 CITY, LEN(city) City_Length from station order by City_Length desc, City ASC
но в этом случае он отобразит вывод в 2 таблицах, и если мы хотим объединить в одну таблицу, мы можем использовать Union или Union ALL. Ниже приведен SQL-запрос для того же
select * from (
select top 1 City, LEN(City) City_Length from STATION order by City_Length ASC,City ASC) TblMin
UNION
select * from (
select top 1 CITY, LEN(city) City_Length from STATION order by City_Length desc, City ASC) TblMax
здесь я вкладываю инструкцию select в подзапрос, потому что когда мы используем предложение order by, мы не можем использовать Union или Union ALL напрямую, поэтому я написал его в подзапросе.
2016-10-16 17:30
Кратчайший:
select TOP 1 CITY,LEN(CITY) LengthOfCity FROM STATION ORDER BY LengthOfCity ASC, CITY ASC;
Серия:
select TOP 1 CITY,LEN(CITY) LengthOfCity FROM STATION ORDER BY LengthOfCity DESC, CITY ASC;
Это работает для проблемы вызова HackerRank (MS SQL Server).
2017-08-13 12:29
В MySQL
(select city, LENGTH(city) cityLength from station order by cityLength desc,city asc LIMIT 1)
union all
(select city, LENGTH(city) cityLength from station order by cityLength asc,city asc LIMIT 1)
2018-04-24 15:44
Может быть, более простой вариант, так как я полагаю, что вы ищете помощь в решении вопроса о рейтинге Хакера? Добавление лимитов облегчило мне отладку, когда проблема была с возвращенной ошибкой.
SELECT city, length(city) FROM station order by length(city) desc limit 1;
SELECT city, length(city) FROM station order by length(city) asc, city asc limit 1
2017-04-25 14:18
Ваш запрос требует всего несколько настроек. Основная проблема заключается в том, что вы не можете использовать a
в подзапросе, как вы делаете:
select a.city, a.city_length
from (select city, char_length(city) city_length
from station
) a
where a.city_length = (select min(char_length(city)) from station) or
a.city_length = (select max(char_length(city)) from station);
Тем не менее, более простой способ написать запрос:
select s.*
from station s cross join
(select min(char_length(city)) as mincl, max(char_length(city)) as maxcl
from station
) ss
where char_length(s.city) in (mincl, maxcl);
2016-02-14 20:16
По возрастанию:
ВЫБЕРИТЕ город, CHAR_LENGTH(город) ОТ станции ЗАКАЗАТЬ CHAR_LENGTH (город), город LIMIT 1;
По убыванию:
ВЫБЕРИТЕ город, CHAR_LENGTH(город) ОТ станции ЗАКАЗАТЬ CHAR_LENGTH (город) DESC, город LIMIT 1;
2017-08-31 08:10
Это еще один способ сделать это в MySQL. Может быть, не самый лучший, но логически верный вариант.
select
city,
length(city)
from
station
where
length(city) in
(
select
max(length(city))
from
station
union
select
min(length(city))
from
station
)
order by
length(city) desc,
city asc limit 2;
2021-01-30 11:05
В Oracle:
выберите * из (выберите город, мин. (длина (город)) минл из группы станций по порядку городов по минл, город) где rownum = 1; выберите * из (выберите город, max(длина (город)) maxl из группы станций по порядку городов по maxl desc, city), где rownum = 1;
2017-03-20 04:26
Это подход с CTE. Сначала он находит самый длинный и самый короткий, чем соответствующие города:
DECLARE @tbl TABLE(CityName VARCHAR(100));
INSERT INTO @tbl VALUES ('xy'),('Long name'),('very long name'),('middle'),('extremely long name');
WITH MyCTE AS
(
SELECT MAX(LEN(CityName)) AS Longest
,MIN(LEN(CityName)) AS Shortest
FROM @tbl
)
SELECT *
FROM MyCTE
--You must think about the chance of more than one city matching the given length
CROSS APPLY(SELECT TOP 1 CityName FROM @tbl WHERE LEN(CityName)=Longest) AS LongestCity(LongName)
CROSS APPLY(SELECT TOP 1 CityName FROM @tbl WHERE LEN(CityName)=Shortest) AS ShortestCity(ShortName)
Результат
Longest Shortest LongName ShortName
19 2 extremely long name xy
2016-02-14 20:34
Первоначально найти самую короткую длину city
и принимая союз с самой длинной длиной city
, Это минимизирует сложность запроса.
(select city, char_length(city) as len_city
from station
order by len_city limit 1)
union ( select city, char_length(city) as len_city
from station
order by len_city desc limit 1)
order by len_city
2016-09-02 20:03
Я сделал это в SQL Server, используя функции CTE и dens_rank. Как работает рейтинг?
Первый раздел (формы групп) по длинам, то есть одинаковые длины составляют группу (раздел). Затем упорядочите все имена в алфавитном порядке в каждом разделе. Затем назначьте ранги (столбец dRank) в каждом разделе. Таким образом, ранг 1 в каждой группе будет присвоен именам, которые в алфавитном порядке появляются первыми в соответствующем разделе. Все это происходит в общем табличном выражении (блок cte)
"with cte as
(
select *, LEN(city) as length, DENSE_RANK() over (partition by len(city) order by city) as dRank from Station
)"
select city,length from cte where dRank = 1 and length = (select MIN(length) from cte)
UNION
select city,length from cte where dRank = 1 and length = (select max(length) from cte)"
2016-05-28 22:36
Я использовал предложение WITH для Oracle, чтобы сохранить самые короткие / самые длинные имена во временной переменной, а не выполнять запросы внутри основного предложения from.Пример предложения SQL WITH
WITH shortnames AS
(SELECT city, length(city)
FROM station
ORDER BY length(city) asc, city),
longnames AS
(SELECT city, length(city)
FROM station
ORDER BY length(city) desc, city)
SELECT * FROM shortnames WHERE ROWNUM=1
UNION ALL
SELECT * FROM longnames WHERE ROWNUM=1;
2020-12-12 00:24
select top(1) city, max(len(city)) [Length] from station group by city order by [Length]
select top(1) city, max(len(city)) [Length] from station group by city order by [Length] DESC
Протестировано в SQL Server 2016
2016-09-24 19:35
Для кратчайшего названия города: ВЫБЕРИТЕ ST.CITY, ДЛИНУ (ST.CITY) КАК ДЛИНА ОТ СТАНЦИИ ST ЗАКАЗ ДЛИНОЙ ASC, ST.CITY ASC
LIMIT 1;
Для самого длинного названия города: ВЫБЕРИТЕ ST.CITY, ДЛИНУ (ST.CITY) КАК ДЛИНА ОТ СТАНЦИИ ST ЗАКАЗ ПО ДЛИНЕ DESC, ST.CITY DESC
LIMIT 1;
2018-10-13 19:38
Вот решение, которое строго использует MIN и MAX
Концепция здесь заключается в применении к длине названия города. В пределах этих результатов снова применить
MIN
к самому названию города , чтобы найти первый по алфавиту.
Конечно, используйте
MAX
таким же образом найти максимальную длину города и выполнить
UNION
из двух запросов для окончательного решения.
Никаких сортов,
ASC
,
DESC
,
LIMIT
, или же
ORDER BY
нужный.
Отличная ссылка:https://www.zentut.com/sql-tutorial/sql-min-max/
(
SELECT s3.CITY, s3.Len
FROM (
SELECT CITY, s1.Len
FROM (
SELECT CITY, LENGTH(CITY) AS Len
FROM STATION
) s1
WHERE
s1.Len = (
SELECT MIN(s2.Len2)
FROM (
SELECT LENGTH(CITY) AS Len2
FROM STATION
) s2
)
) s3
WHERE
s3.CITY = (
SELECT MIN(CITY)
FROM STATION
WHERE s3.Len = LENGTH(CITY)
)
) UNION (
SELECT s3.CITY, s3.Len
FROM (
SELECT CITY, s1.Len
FROM (
SELECT CITY, LENGTH(CITY) AS Len
FROM STATION
) s1
WHERE
s1.Len = (
SELECT MAX(s2.Len2)
FROM (
SELECT LENGTH(CITY) AS Len2
FROM STATION
) s2
)
) s3
WHERE
s3.CITY = (
SELECT MIN(CITY)
FROM STATION
WHERE s3.Len = LENGTH(CITY)
)
);
2022-01-14 18:44
В дополнение ко всем ответам выше, я хочу поделиться трюком, который я использовал в 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 вернет оба ответа в одном запросе, без окон и без объединений:
SELECT
STUFF(min(
concat(
REPLACE(STR(CAST(LEN(city) AS INT) ,7), SPACE(1), '0')
,city))
,1,7,'')
as [min_len],
STUFF(max(
concat(
REPLACE(STR(CAST(LEN(city) AS INT) ,7), SPACE(1), '0')
,city))
,1,7,'')
as [max_len]
from station
Это также позволяет вам получить минимальную максимальную информацию из любого другого столбца (в той же строке), например столбца «station_ranking», если он существует.
Вот пример dbfiddle с MySQL:
SELECT
SUBSTR(min(
concat(
LPAD(length(city), 7, '0')
,city))
,7+1)
as min_name_len,
SUBSTR(max(
concat(
LPAD(station_rank, 2, '0')
,city))
,2+1)
as max_name_rank
from stations
https://www.db-fiddle.com/f/76ew1fK9D5V3vopbGUuYxh/4
2023-01-30 19:09
Следующий запрос кажется достаточно простым:
select
city, leng
from
(select top 1
city, len(city) leng
from
station
where
len(city) = (select min(len(city)) from station)
order by
city
Union all
select top 1
city, len(city) leng
from
station
where
len(city) = (select max(len(city)) from station)
order by
city) result;
1-й запрос внутри возвращает город с минимальной длиной, а 2-й запрос возвращает город с максимальной длиной.
Надеюсь это поможет.
2018-05-12 09:23
Это работает для
mysql
-- smallest
SELECT city, length(city) FROM station
WHERE length(city) = (select min(length(city)) from station)
ORDER BY city
limit 1;
-- largest
SELECT city, length(city) FROM station
WHERE length(city) = (select max(length(city)) from station)
ORDER BY city
limit 1;
2022-01-06 07:56
В Oracle это было бы,
SELECT CITY,LENGTH(CITY) FROM (SELECT MIN(CITY) CITY FROM STATION WHERE LENGTH(CITY)=(SELECT MIN(LENGTH(CITY)) FROM STATION))
UNION ALL
SELECT CITY,LENGTH(CITY) FROM (SELECT MAX(CITY) CITY FROM STATION WHERE LENGTH(CITY)=(SELECT MAX(LENGTH(CITY)) FROM STATION));
2019-06-17 20:29
Для оракула:
select min(city),length(city) from station where length(city) <= all(select
length(city) from station) group by length(city);
select max(city),length(city) from station where length(city) >= all(select
length(city) from station) group by length(city);
2018-02-09 20:04
Этот запрос будет хорошо работать в ваших условиях, эти 2 запроса точно такие же. В первом запросе мы просто упорядочиваем запись в порядке убывания, чтобы взять название города с наибольшей длиной, а во второй части мы просто записываем записи в порядке возрастания, чтобы взять город с минимальной длиной, все остальные запросы одинаковы. Кидни, погляди.
Деталь:
- Выберите заявление, чтобы вынуть записи
- Используйте group by, потому что я использую функцию агрегирования Len().
-
Упорядочивание всех найденных записей в порядке убывания и возрастания, чтобы получить верхнюю 1 и взять максимальную и минимальную длину города.
select Top 1 City,max(len(City)) as Length from STATION group by City ORDER BY Length desc select Top 1 City,max(len(City)) as Length from STATION group by City ORDER BY Length ASC
2019-07-26 08:44
Выберите город, длина (город) из (выберите город, длина (город), ранг () над (разделение по длине (город), порядок по длине (город), город по возрастанию) как rnk от станции) a, где a.rnk=1;
2020-05-24 12:45
В Oracle мы можем сделать вот так
select city, length(city)
from (select city from STATION order by length(city) DESC, city ASC)
where rownum = 1
union
select city, length(city)
from (select city from STATION order by length(city), city ASC)
where rownum = 1;
Идея состоит в том, чтобы получить самый длинный и самый короткий город, а затем объединить их в один результат.
2020-06-12 12:56
SELECT MAX(LENGTH(transaction_id)) AS Longest ,MIN(LENGTH(transaction_id)) AS Shortest FROM cards
2020-06-16 10:00
Для Oracle SQL в одной результирующей таблице. Это позволит получить минимальное и максимальное названия городов, и, если они имеют одинаковую длину, первый город будет отсортирован в алфавитном порядке.
SELECT * FROM (
SELECT CITY, LENGTH(CITY) CITY_LENGTH
FROM STATION
ORDER BY CITY_LENGTH ASC, CITY ASC ) MAX_LEN
WHERE ROWNUM <= 1
UNION
SELECT * FROM (
SELECT CITY, LENGTH(CITY) CITY_LENGTH
FROM STATION
ORDER BY CITY_LENGTH DESC, CITY ASC ) MIN_LENGTH
WHERE ROWNUM <= 1;
2020-04-28 12:38
В Oracle (и любом другом языке, который поддерживает аналитические функции), используя ROW_NUMBER
Аналитическая функция позволяет назначать строки уникальный номер в соответствии с ASC
окончание (или DESC
окончание) длина города. Поскольку может быть несколько строк одинаковой длины, можно применить вторичный порядок, чтобы получить первый город этой длины в алфавитном порядке. Тогда все, что вам нужно, это внешний запрос, чтобы отфильтровать результаты только по самому короткому (или самому длинному) имени:
SELECT city
FROM (
SELECT CITY,
ROW_NUMBER() OVER ( ORDER BY LENGTH( CITY ) ASC, CITY ) shortest_rn,
ROW_NUMBER() OVER ( ORDER BY LENGTH( CITY ) DESC, CITY ) longest_rn
FROM station
)
WHERE shortest_rn = 1
OR longest_rn = 1;
Если вы хотите вернуть все города с самым коротким (или самым длинным) названием, используйте DENSE_RANK
вместо ROW_NUMBER
:
SELECT city
FROM (
SELECT CITY,
DENSE_RANK() OVER ( ORDER BY LENGTH( CITY ) ASC ) shortest_rn,
DENSE_RANK() OVER ( ORDER BY LENGTH( CITY ) DESC ) longest_rn
FROM station
)
WHERE shortest_rn = 1
OR longest_rn = 1
ORDER BY shortest_rn, city; -- Shortest first and order tied lengths alphabetically
2018-01-12 14:56
Length (CITY) вернет длину строки,
https://www.w3schools.com/sql/func_mysql_length.asp
(select CITY, length(CITY) from STATION order by length(CITY),CITY limit 1)
UNION
(select CITY, length(CITY) from STATION order by length(CITY) DESC limit 1);
2020-12-04 19:06
Для Oracle это сработало для меня (HackerRank)
--shortest
SELECT CITY,L FROM
(select CITY,length(CITY) L
from STATION
order by length(CITY) ASC, CITY ASC)
WHERE ROWNUM=1
UNION ALL
--longest
SELECT CITY,L FROM
(select CITY,length(CITY) L
from STATION
order by length(CITY) DESC, CITY ASC)
WHERE ROWNUM=1;
Texto original Я пробовал много способов, но эту работу я упорядочил по длине, а затем в алфавитном порядке, и в итоге получил только первую строку.
2021-08-30 11:26
В Oracle 12c это можно сделать с помощью FETCH..FIRST
самый короткий
select * FROM station ORDER BY LENGTH(city) DESC FETCH FIRST 1 ROWS ONLY;
самыйдлинный
select * FROM station ORDER BY LENGTH(city) ASC FETCH FIRST 1 ROWS ONLY;
2018-01-12 16:34
Я думаю, что это должно работать:
SELECT MAX(CITY) , LENGTH(MAX(CITY)) FROM STATION;
SELECT MIN(CITY) , LENGTH(MIN(CITY)) FROM STATION;
2017-05-10 18:25
Другие вопросы по тегам
sql
У меня есть таблица с одним из столбцов типа varchar (city). и хотите найти самое длинное и самое короткое из значений, хранящихся в этом столбце.
Кто-нибудь может помочь? Спасибо
Одно решение:
- 2 С какой СУБД вы работаете? Для нас важно знать, так как мы сможем использовать более эффективные функции, специфичные для rdbms (и дать вам несколько советов по продвинутым технологиям)
- Обратите внимание, что может не быть «самого длинного» имени, то есть у вас может быть несколько.
Я не думаю, что нам нужно использовать функции Min и Max, и Group by также не требуется.
Мы можем добиться этого, используя следующий код:
но в этом случае он будет отображать результат в 2 таблице и если мы хотим объединить в одну таблицу, мы можем использовать Union или Union ALL. Ниже приведен SQL-запрос для того же
здесь я вкладываю оператор select в подзапрос, потому что, когда мы используем предложение order by, мы не можем использовать Союз или Союз ВСЕ непосредственно, поэтому я написал его внутри подзапроса.
- с ошибкой оракула появляется как
- 2 Ответ для конкретного продукта на вопрос без указания dbms. По крайней мере, скажите нам, для каких dbms это нужно.
- @jarlh Это для SQL Server.
Самый короткий:
Самый длинный:
Это работает для проблемы вызова HackerRank (MS SQL Server).
- если мы выберем , то этот запрос не работает в ранге хакера. он выдает ошибку, поскольку `error is ОШИБКА в строке 1: ORA-00904: «TOP»: неверный идентификатор`
- Этот запрос предназначен для MS SQL Server и не будет работать с Oracle. Попробуйте это для оракула: Кратчайший: выберите * из (выберите ГОРОД, ДЛИНА (ГОРОД) LengthOfCity ОТ СТАНЦИИ ЗАКАЗАТЬ ПО LengthOfCity ASC, CITY ASC) где rownum = 1; Самый длинный: выберите * из (выберите ГОРОД, ДЛИНА (ГОРОД) LengthOfCity FROM STATION ORD BY LengthOfCity DESC, CITY ASC), где rownum = 1;
- 2 Для MySql: ВЫБЕРИТЕ CITY, LENGTH (CITY) как LEN FROM STATION ORDER BY LEN ASC, CITY ASC LIMIT 1; ВЫБЕРИТЕ ГОРОД, ДЛИНУ (ГОРОД) в качестве LEN FROM STATION ORDER BY LEN DESC, CITY ASC LIMIT 1;
- что такое LengthOfCity … это похоже на псевдоним … нет имени столбца, такого как LengthOfCity на ранге хакера
- @ShubhamJain, вы правы, это псевдоним, определенный для использования позже в ORDER.
В MySQL
- почему LIMIT 1? Не могли бы вы пролить свет?
- 1 @Taylor, сокращает вывод запроса до одной записи (в данном случае город). С помощью запроса вы получите город с самым коротким и самым длинным названием города.
Может быть, это более простой вариант, поскольку я полагаю, вы ищете помощь с решением вопроса о ранге хакера? Добавление ограничений упростило мне отладку, в которой проблема заключалась в возвращенной ошибке.
Ваш запрос требует всего нескольких настроек. Основная проблема заключается в том, что вы не можете использовать в подзапросе, как вы это делаете:
Тем не менее, более простой способ написать запрос:
В Oracle:
select * from (выбрать город, min (длина (город)) minl из группы станций по городам, по minl, city), где rownum = 1; select * from (выберите город, max (длина (город)) maxl из группы станций по порядку городов по maxl desc, city), где rownum = 1;
По возрастанию:
ВЫБЕРИТЕ город, CHAR_LENGTH (город) ОТ станции ORDER BY CHAR_LENGTH (город), город LIMIT 1;
По убыванию:
ВЫБЕРИТЕ город, CHAR_LENGTH (город) ОТ станции ORDER BY CHAR_LENGTH (город) DESC, город LIMIT 1;
Это подход с CTE. Сначала он находит самый длинный и самый короткий, чем соответствующие города:
Результат
Первоначально находим наименьшую длину и берём объединение с наибольшей длиной . Это минимизирует сложность запроса.
Протестировано в SQL Server 2016
Я сделал это в SQL Server, используя CTE и функцию density_rank. Как работает рейтинг?
Первое разделение (формирование групп) по длине, то есть одинаковые длины составляют группу (раздел). Затем расположите все имена в алфавитном порядке внутри каждого раздела. Затем назначьте ранги (столбец dRank) в каждом разделе. Таким образом, ранг 1 в каждой группе будет присвоен именам, которые в алфавитном порядке появляются первыми в соответствующем разделе. Все это происходит в общем табличном выражении (блоке cte)
В Oracle (и любом другом языке, поддерживающем аналитические функции), используя аналитическую функцию , вы можете присвоить строкам уникальный номер в соответствии с длиной ending (или ending) для города. Поскольку может быть несколько строк одинаковой длины, можно применить вторичный порядок, чтобы получить первый город такой длины по алфавиту. Тогда все, что вам нужно, это внешний запрос для фильтрации результатов только по самому короткому (или самому длинному) имени:
Если вы хотите вернуть все города с самым коротким (или самым длинным) именем, используйте вместо :
В Oracle 12c это можно было сделать с помощью
Самый короткий
Самый длинный
Для оракула:
Следующий запрос кажется достаточно простым:
Первый запрос внутри возвращает город с минимальной длиной, а второй запрос возвращает город с максимальной длиной.
Надеюсь это поможет.
Для кратчайшего названия города:
Для самого длинного названия города:
В Oracle это было бы,
Этот запрос будет хорошо работать в вашем состоянии, эти 2 запроса точно такие же. В первом запросе мы просто упорядочиваем запись в порядке убывания, чтобы взять название города с наибольшей длиной, а во второй части мы просто берем записи в порядке возрастания, чтобы взять город с минимальной длиной, все остальные запросы такие же. Похищай взгляни.
Деталь:
- Выберите выписку, чтобы вывести записи
- Используйте предложение group by, потому что я использую агрегатную функцию Len ().
-
Упорядочивание всех извлеченных записей в порядке убывания и возрастания, чтобы получить первую 1 и взять город максимальной и минимальной длины.
Для Oracle SQL в одной результирующей таблице. Это позволит получить минимальное и максимальное названия городов, и, если они имеют одинаковую длину, первый город будет отсортирован в алфавитном порядке.
выберите город, длина (город) из (выберите город, длина (город), ранг () над (разделение по длине (город), порядок по длине (город), город по возрастанию) как rnk от станции) a, где a.rnk = 1 ;
В Oracle, мы можем сделать вот так
Идея состоит в том, чтобы получить самый длинный и самый короткий город, а затем объединить их в один результат.
- 1 Добро пожаловать в Stack Overflow! Хотя этот фрагмент кода может решить вопрос, включение объяснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для человека, который задает его сейчас! Отредактируйте свой ответ, чтобы добавить пояснение и указать, какие ограничения и предположения применяются.
- Пожалуйста, дайте объяснение этому.
Самый короткий:
Самый длинный:
Я думаю, это должно сработать:
- Максимальное и минимальное значение для varchar, сравните значения в алфавитном порядке, а не по длине