字符串上的Oracle聚合函数

字符串上的Oracle聚合函数,oracle,Oracle,我有一名员工有多名经理。经理姓名字段有(firstname,lastname),电子邮件字段有(last)。first@email.com)。没有经理id。 因此,当我尝试按员工id对其进行分组以获得最多的经理姓名和电子邮件时,有时我会得到错误的姓名/电子邮件id组合 例: 当我按个人分组并获得最大值(经理姓名)、经理电子邮件时,我得到 person max(Mgr_name) max(Mgr_email) ------- --------- ---------- 111

我有一名员工有多名经理。经理姓名字段有(firstname,lastname),电子邮件字段有(last)。first@email.com)。没有经理id。 因此,当我尝试按员工id对其进行分组以获得最多的经理姓名和电子邮件时,有时我会得到错误的姓名/电子邮件id组合

例:

当我按个人分组并获得最大值(经理姓名)、经理电子邮件时,我得到

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

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

改用行号分析功能:

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_名称

输出:

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

您可以使用子选择获取表中每个人的max mgr_名称,然后将其连接回基本结果,以限制仅显示每个人的“max”管理器

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

您如何知道选择这两个值中的哪一个?“布拉德,皮特”和“皮特”是否同样正确。brad@test.com因为它是为了得到“迈克,克拉克”和“克拉克”。mike@test.com“只要你没有从每一行中得到一个值?也许,这两行中最新的一行是理想的。抱歉说得含糊不清。请定义“最新”。是否有一些
日期
时间戳
列可用于标识最新的行?是否可以使用单调递增的键列?是否有时间戳。所以,对它们进行密集排序,并按时间戳排序,就得到了我想要的东西。谢谢你开车送我回家:谢谢。我要试试这个。稠密的队伍给了我想要的东西。所以,这里还有一个问题。如果我有20个字段要修复。将密集等级添加到所有20个,是否会造成性能问题?我看到的是>百万行。分析函数为查询增加了性能,但我真的不理解你的观点,你能把这当作另一个问题,提供更多细节和示例数据吗?
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