我想按姓氏对我的表中的名字进行排序,并在两个不同的列中过滤掉最短和最长的名字,有几个姓氏相同的人,如 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 | 霍华德 | 霍华德 |
但是我不知道如何进行,有什么建议吗?
在 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 |
---|---|---|
鲍勃 | 最大 | 霍华德 |
鸭 | 鲍勃 | 霍华德 |
米奇 | 最大 | 罗纳德 |