oracle SQL按姓氏对最短和最长的名字排序

siv3szwd  于 2023-05-22  发布在  Oracle
关注(0)|答案(1)|浏览(155)

我想按姓氏对我的表中的名字进行排序,并在两个不同的列中过滤出最短和最长的名字,有几个人的姓氏相同,如Max Bob,Mini Bob,霍华德Bob等。我只想要最短和最长的名字对应的姓氏
示例:
| 姓|最短名字|最长名字|
| --------------|--------------|--------------|
| 米奇|马克斯|罗纳德|
| 鸭子|鲍勃|霍华德|
| 鲍勃|马克斯|霍华德|
等等
到目前为止,我有:

SELECT
COUNT(last_name) as last name,
MIN(first_name) as shortest,
MAX(first_name) as longest
FROM
hr.employees
group by first_name;

它给出了last_name的计数,而不是last_name本身
| 姓|最短名字|最长名字|
| --------------|--------------|--------------|
| 1|马克斯|马克斯|
| 1|霍华德|霍华德|
| 2|马克斯|马克斯|
| 2|霍华德|霍华德|
但我不知道该怎么办有什么建议吗

zhte4eai

zhte4eai1#

在Oracle中,我们可以在这里使用keep语法:

select last_name,
    min(first_name) keep(dense_rank first order by length(first_name)) shortest_last_name,
    min(first_name) keep(dense_rank last  order by length(first_name)) longest_last_name
from employees
group by last_name;

如果存在最短或最长名字的关系,则查询按字符串方式选择“最小”值。
下面是一个demo:

with employees as (
    select 'Mickey' as last_name, 'Max' as first_name from dual
    union all select 'Mickey', 'Ronald' from dual
    union all select 'Mickey', 'Bill' from dual
    union all select 'Duck', 'Bob' from dual
    union all select 'Duck', 'Howard' from dual
    union all select 'Bob', 'Max' from dual
    union all select 'Bob', 'Howard' from dual
)
select last_name,
    min(first_name) keep(dense_rank first order by length(first_name)) shortest_last_name,
    min(first_name) keep(dense_rank last  order by length(first_name)) longest_last_name
from employees
group by last_name;
公司简介最短姓氏最长姓氏
鲍勃马克斯霍华德
鸭子鲍勃霍华德
米奇马克斯罗纳德

fiddle

相关问题