mysql - 当有多个城市时,查询显示 max_length_name_city 和 min_length_name_city 按 alfabet 排序
问题描述
为什么我的查询错误?
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;
问题陈述:查询STATION中两个城市的CITY名称最短和最长,以及它们各自的长度(即:名称中的字符数)。如果有多个最小或最大的城市,请选择按字母顺序排列的第一个城市。
样本输入
例如,CITY 有四个条目:
CITY
----
DEF
ABC
PQRS
WXY
样本输出
ABC 3
PQRS 4
说明 按字母顺序排列时,CITY 名称列为 ABC、DEF、PQRS 和 WXY,长度为 和 。最长的名称是 PQRS,但有最短命名城市的选项。选择 ABC,因为它按字母顺序排在第一位。
注意您可以编写两个单独的查询来获得所需的输出。它不必是单个查询。
解决方案
MIN(city)
是词汇量最小的城市。所以给定“Aachen”和“Dover”,它将是“Aachen”。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;
(这可能看起来是一个更简单的查询,但不能在城市上使用索引)。
推荐阅读
- python - 如何为 Pytesseract 处理这个图像?
- node.js - 保存时对象的 Mongoose 数组为空
- python - Python Asyncio:GET 调用在 FPL API 端点上返回空响应
- c - 客户端关闭套接字连接后服务器挂在recv方法上
- sql - 如何获取具有位置的员工每天的最小和最大日期?
- tensorflow - 批处理结束后如何更改 Tensorflow 中的学习率?
- python - 在 python 包 install_requires 中指定“或”
- python - seaborn FacetGrid 垂直轴上的分层标签
- python - Python 到 C++ 通信失败
- python - 如何从 SymPy 中提取椭圆的中心坐标、高度、宽度和 phi 以绘制拟合椭圆?