最短和最长的城市名称

时间:2019-12-25 06:49:03

标签: sql oracle

查询STATION中两个带有最短和最长CITY名称以及它们各自长度(即名称中字符数)的城市。如果最小或最大的城市不止一个,请按字母顺序选择最先出现的城市。

我可以知道这个问题的答案吗?

  SELECT CITY,
         LENGTH(CITY)
    FROM STATION
ORDER BY CITY ASC
   FETCH FIRST 1 ROWS ONLY ;

为什么该查询不适用于获取最短长度的城市?

9 个答案:

答案 0 :(得分:2)

我将在此处使用ROW_NUMBER

WITH cte AS (
    SELECT s.*, ROW_NUMBER() OVER (ORDER BY LENGTH(CITY), CITY) rn_first,
        ROW_NUMBER() OVER (ORDER BY LENGTH(CITY) DESC, CITY) rn_last
    FROM STATION s
)

SELECT CITY, LENGTH(CITY) AS CITY_LENGTH
FROM cte
WHERE 1 IN (rn_first, rn_last)
ORDER BY LENGTH(CITY);

这将生成两个记录的结果集,最短的城市名称首先出现,最长的城市最后出现。

答案 1 :(得分:1)

您需要修改ORDER BY

SELECT CITY, LENGTH(CITY)
FROM STATION
ORDER BY LENGTH(CITY) DESC, CITY
FETCH FIRST 1 ROWS ONLY ;

这将给出最长名称的答案。对于最短的名称,只需将ORDER BY更改为ASC使用LENGTH(CITY)

答案 2 :(得分:1)

在Oracle中我最喜欢的方法是使用Parent关键字:

keep

根据我的经验,select min(city) keep (dense_rank first order by length(city) asc) as shortest_city, min(city) keep (dense_rank first order by length(city) desc) as longest_city, min(length(city)) as min_len, max(length(city)) as max_len from station; 的性能非常好,因此如果在大数据上具有最佳性能,我不会感到惊讶。

答案 3 :(得分:0)

SELECT CITY,
       LENGTH(CITY) as length
  FROM CITY
 ORDER BY length ASC limit 1;

答案 4 :(得分:0)

似乎您正在使用Oracle12c+,因此可以使用FETCH FIRST 1 ROWS ONLY子句以LENGTH(CITY)升序和降序使用,其中CITY列是{{ 1}}子句,用于按字母顺序排列城市名称。因此使用:

ORDER BY

Demo

答案 5 :(得分:0)

谢谢您的答复。我将检查一次“保持”。 我是通过这种方式解决的。是否还有其他可能性可以对其进行优化或简化?

**

select city,length(city) as "SL"

from (select city from station  order by city asc) 

where length(city) in (select min(length(city)) from station) and rownum=1; 

select city,length(city) as "LL"

from (select city from station  order by city asc) 

where length(city) in (select max(length(city)) from station) 

order by city desc;`

**

答案 6 :(得分:0)

对于 MS SQL Server,解决方案如下。

Declare @Small int
Declare @Large int
select @Small = Min(Len(CITY )) from STATION 
select @Large = Max(Len(CITY )) from STATION
;with cte1 as(
select Top 1 CITY  as SmallestCity,Len(CITY ) as Minimumlength from STATION  where Len(CITY ) = @Small Order by CITY  Asc
),
cte2 as(
select Top 1 CITY  as LargestCity,Len(CITY ) as MaximumLength from STATION  where Len(CITY ) = @Large Order by CITY  Asc 
)
select * from cte1
union
select * from cte2

它的输出看起来像这样, Out put of query

答案 7 :(得分:-1)

选择城市,长度(城市)

从站

(选择分钟(长度(城市))的城市长度(城市)

                                   FROM  STATION
                            )

AND ROWNUM <= 1

联盟

选择城市,长度(城市)

从站 (选择最大(LENGTH(CITY))的城市长度)

                               FROM  STATION )

AND ROWNUM <= 1

按城市ASC订购;

答案 8 :(得分:-1)

SELECT top 1 City,LEN(City) as Citylength into #tmp
FROM STATION
WHERE LEN(City)=(SELECT MIN(LEN(City)) FROM STATION )
order by City asc

SELECT top 1 City,LEN(City) as Citylength into #tmp1
FROM STATION
WHERE LEN(City)=(SELECT MAX(LEN(City)) FROM STATION )
order by City

select * from #tmp
union
select * from #tmp1
相关问题