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