Sql как найти самое длинное имя

In addition to all answers above, I want to share a trick I used in T-SQL but exist in any version:

  1. 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')
  2. I append the 0-padded LEN() to the value
    • concat( <step1> , city )
  3. I choose MAX() or MIN()
    • This works because the 0 padded number can be sorted alphabetically.
    • Example: "099" < "100", but "99" > "100" because "9" > "1" in ascii)
  4. 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ə's user avatar

ˈvɔlə

8,92610 gold badges63 silver badges89 bronze badges

asked Feb 19, 2014 at 15:38

vuyy1182's user avatar

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 Linoff's user avatar

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 Kettner's user avatar

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

tmthyjames's user avatar

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

xeraphim's user avatar

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

Srinivas Rathikrindi's user avatar

For Oracle 11g:

SELECT COL1 
FROM TABLE1 
WHERE length(COL1) = (SELECT max(length(COL1)) FROM TABLE1);

answered Aug 29, 2016 at 23:22

kavehmb's user avatar

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

Shobi's user avatar

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's user avatar

Dilan

2,5707 gold badges23 silver badges32 bronze badges

answered Aug 21, 2020 at 9:39

divyesh chavan's user avatar

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

pjammer's user avatar

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's user avatar

David Buck

3,71335 gold badges31 silver badges35 bronze badges

answered Oct 18, 2020 at 3:48

Sahil Sharma's user avatar

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

Revan's user avatar

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 Kumar's user avatar

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.
enter image description here
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

Anar Salimkhanov's user avatar

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's user avatar

double-beep

4,97617 gold badges32 silver badges41 bronze badges

answered Jun 3, 2020 at 12:02

SUPS's user avatar

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

Devca's user avatar

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]
Fig. 1 Selecting All from the Table

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,

Fig.2 Longest and Shortest Names from the Table.

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,

Fig. 3 Single Result Set

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, но он существует в любой версии:

  1. Я вычисляю длину с ведущими 0 колодками, которые позволяют сортировать по алфавиту
    • В этом примере я предполагаю, что весь текст будет меньше 10 МБ, поэтому максимум 7-значное число
    • REPLACE(STR(CAST(LEN(city) AS INT) ,7), SPACE(1), '0')
  2. Я добавляю 0-дополненныйLEN()к стоимости
    • concat( <step1> , city )
  3. я выбираюMAX()илиMIN()
    • Это работает, потому что число, дополненное 0, может быть отсортировано в алфавитном порядке.
    • Пример:"099" < "100", но"99" > "100"потому что"9" > "1"в ascii)
  4. Я удаляю число из значения
    • 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 запроса точно такие же. В первом запросе мы просто упорядочиваем запись в порядке убывания, чтобы взять название города с наибольшей длиной, а во второй части мы просто записываем записи в порядке возрастания, чтобы взять город с минимальной длиной, все остальные запросы одинаковы. Кидни, погляди.

Деталь:

  1. Выберите заявление, чтобы вынуть записи
  2. Используйте group by, потому что я использую функцию агрегирования Len().
  3. Упорядочивание всех найденных записей в порядке убывания и возрастания, чтобы получить верхнюю 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 запроса точно такие же. В первом запросе мы просто упорядочиваем запись в порядке убывания, чтобы взять название города с наибольшей длиной, а во второй части мы просто берем записи в порядке возрастания, чтобы взять город с минимальной длиной, все остальные запросы такие же. Похищай взгляни.

Деталь:

  1. Выберите выписку, чтобы вывести записи
  2. Используйте предложение group by, потому что я использую агрегатную функцию Len ().
  3. Упорядочивание всех извлеченных записей в порядке убывания и возрастания, чтобы получить первую 1 и взять город максимальной и минимальной длины.

    
    

Для Oracle SQL в одной результирующей таблице. Это позволит получить минимальное и максимальное названия городов, и, если они имеют одинаковую длину, первый город будет отсортирован в алфавитном порядке.


выберите город, длина (город) из (выберите город, длина (город), ранг () над (разделение по длине (город), порядок по длине (город), город по возрастанию) как rnk от станции) a, где a.rnk = 1 ;

В Oracle, мы можем сделать вот так


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



  • 1 Добро пожаловать в Stack Overflow! Хотя этот фрагмент кода может решить вопрос, включение объяснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для человека, который задает его сейчас! Отредактируйте свой ответ, чтобы добавить пояснение и указать, какие ограничения и предположения применяются.

  • Пожалуйста, дайте объяснение этому.

Самый короткий:


Самый длинный:


Я думаю, это должно сработать:


  • Максимальное и минимальное значение для varchar, сравните значения в алфавитном порядке, а не по длине

Понравилась статья? Поделить с друзьями:
  • Как составить заявление на понижение арендной платы
  • Как найти мощность излучения фотонов
  • Как найти мурамасу каламити
  • Как найти налоги детей
  • Как найти длину трубы через диаметр