Oracle聚合字符串上的函数

时间:2015-02-26 20:27:50

标签: oracle

我的员工有多位经理。经理姓名字段有(名字,姓氏),电子邮件字段有(last.first@email.com)。没有经理姓名。 因此,当我尝试按员工ID对此进行分组以获取管理员姓名和电子邮件的最大值时,有时我最终会得到错误的名称/电子邮件ID组合。

例如:

person  Mgr_name    Mgr_email
------- ---------   ----------
111     brad,pitt   pitt.brad@test.com
111     mike,clark  clark.mike@test.com

当我按人分组并获得最大值(mgr_name),mgr_email,我得

person  max(Mgr_name)    max(Mgr_email)
------- ---------        ----------
111     mike,clark        pitt.brad@test.com

如何获得正确的电子邮件/名称组合?

2 个答案:

答案 0 :(得分:1)

改为使用row_number分析函数:

with t(person  ,Mgr_name ,   Mgr_email) as (
select 111     ,'brad,pitt'  , 'pitt.brad@test.com' from dual union all
select 111     ,'mike,clark' , 'clark.mike@test.com' from dual )

select person  ,Mgr_name ,   Mgr_email from (
select t1.*, row_number() over (order by mgr_name) num from t t1)
where num = 1

使用正确的电子邮件获取max mgr_name。

输出:

    PERSON MGR_NAME   MGR_EMAIL          
---------- ---------- -------------------
       111 brad,pitt  pitt.brad@test.com 

答案 1 :(得分:1)

您可以使用子选择来获取表格中每个人的最大mgr_name,然后将其连接回基础结果,以限制仅显示每个人“最大”经理......

SELECT t1.Person, t1.Mgr_name, t1.mgr_email
FROM tableName t1
INNER JOIN (Select max(mgr_name) mname, Person from TableName group by person) t2
 on t1.mgr_name = t2.mname
 and t2.Person = T1.Person