当有多个城市时,通过alfabet显示max\u length\u name\u city和min\u length\u name\u city排序的查询

sycxhyv7  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(219)

为什么我的问题错了?

SELECT MIN(city), LENGTH(MIN(city))
FROM station 
ORDER BY MIN(city) ASC 
LIMIT 1;

SELECT MAX(city), LENGTH(MAX(city)) 
FROM station 
ORDER BY MAX(city) ASC  
LIMIT 1;

问题陈述:查询车站中两个城市的最短城市名和最长城市名,以及它们各自的长度(即:名称中的字符数)。如果有多个最小或最大的城市,请选择按字母顺序排列的第一个城市。
样本输入
例如,“城市”有四个条目:

CITY 
----
DEF 
ABC 
PQRS
WXY

样本输出

ABC 3
PQRS 4

解释按字母顺序排列时,城市名称将按、def、pqrs和wxy列出,并带有长度和长度。最长的名称是pqrs,但也可以选择最短的命名城市。选择,因为它是按字母顺序排在第一位的。
注意:您可以编写两个单独的查询来获得所需的输出。它不必是单个查询。

bq9c1y66

bq9c1y661#

MIN(city) 是词汇上最小的城市。因此,考虑到“亚琛”和“多佛”,它将是“亚琛”。以及 LENGTH(MIN(city)) 是那个城市的长度,所以是6,不是5。
要获得最短的城市名称,您需要以下内容:

select min(city), length(city)
from station
group by length(city)
order by length(city)
limit 1;

按长度分组, min(city) 将为每个长度查找词汇最少的城市名称。
同样,对于最长的名称:

select min(city), length(city)
from station
group by length(city)
order by length(city) desc
limit 1;

(仍然为每个长度选择词汇上的第一个城市名称,但按长度降序排列,而不是按长度升序排列)。
要在单个查询中同时获取这两个信息,最容易使用窗口函数(需要mysql 8.0或mariadb 10.2或更高版本):

select
    first_value(city) over minlen,
    first_value(length(city)) over minlen,
    first_value(city) over maxlen,
    first_value(length(city)) over maxlen
from station
window
    minlen as (order by length(city),city),
    maxlen as (order by length(city) desc,city)
limit 1;

在早期版本中,这样做最简单:

select
    substr(min(concat(lpad(length(city),8,0),city)),9),
    min(length(city)),
    substr(min(concat(99999999-length(city),city)),9),
    max(length(city))
from station;

(这看起来可能是一个更简单的查询,但不能使用城市索引)。

相关问题