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

问题描述 投票:0回答:1

我想按姓氏对我的表中的名字进行排序,并在两个不同的列中过滤掉最短和最长的名字,有几个姓氏相同的人,如 Max Bob、Mini Bob、Howard 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;

这给了我姓氏的计数,但不是姓氏本身

姓氏 最短的名字 最长的名字
1 最大 最大
1 霍华德 霍华德
2 最大 最大
2 霍华德 霍华德

但是我不知道如何进行,有什么建议吗?

sql oracle aggregate-functions greatest-n-per-group
1个回答
1
投票

在 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;

这是一个演示:

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;
LAST_NAME SHORTEST_LAST_NAME LONGEST_LAST_NAME
鲍勃 最大 霍华德
鲍勃 霍华德
米奇 最大 罗纳德

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.