【发布时间】:2015-11-12 16:43:26
【问题描述】:
我有一个如下查询,其中内部查询返回以下结果集。我需要修改查询,以便在它返回空值的最后一行中,我希望返回第一个 emp_id。基本上,试图在最后一行的下一个 empid 中获取第一行中的 empid。我希望这是有道理的。任何想法表示赞赏。
注意:更新了查询,当我将案例逻辑添加到最后一列时,我收到错误 ORA-01467:排序键太长
SELECT * FROM ( SELECT emp_id
, lead(emp_id) OVER ( ORDER BY join_dt DESC, emp_id desc ) AS next_emp_id
, lead(title) OVER ( ORDER BY join_dt DESC, emp_id desc ) AS next_title
, lead(join_dt) OVER ( ORDER BY join_dt DESC, emp_id desc ) AS next_join_dt
,lead(url_keyword) OVER ( ORDER BY publish_dt DESC, art_id desc ) AS next_url_keyword
FROM (
SELECT DISTINCT eca.emp_id, a.title, max(esa.join_dt) as join_dt,REGEXP_SUBSTR(REGEXP_REPLACE(LOWER(a.empword), '[^a-z0-9]+', '-'), '([a-z0-9]+-?){0,5}([a-z0-9]+)') as url_keyword
FROM emp_groups eca, emp a, emp_assignment esa
WHERE eca.emp_group_id = 9
AND eca.emp_id = a.emp_id
AND a.emp_id = esa.emp_id
GROUP BY eca.emp_id, a.title,REGEXP_SUBSTR(REGEXP_REPLACE(LOWER(a.empword), '[^a-z0-9]+', '-'), '([a-z0-9]+-?){0,5}([a-z0-9]+)')
UNION ALL
SELECT DISTINCT eca.emp_id, a.title, max(esa.join_dt) as join_dt, REGEXP_SUBSTR(REGEXP_REPLACE(LOWER(a.empword), '[^a-z0-9]+', '-'), '([a-z0-9]+-?){0,5}([a-z0-9]+)') as url_keyword
FROM emp_groups eca, emp_archive a, emp_assign_archive esa
WHERE eca.emp_group_id = 9
AND eca.emp_id = a.emp_id
AND a.emp_id = esa.emp_id
GROUP BY eca.emp_id, a.title,, REGEXP_SUBSTR(REGEXP_REPLACE(LOWER(a.empword), '[^a-z0-9]+', '-'), '([a-z0-9]+-?){0,5}([a-z0-9]+)')
UNION ALL
SELECT DISTINCT eca.emp_id, a.title, max(esa.join_dt) as join_dt ,REGEXP_SUBSTR(REGEXP_REPLACE(LOWER(a.empword), '[^a-z0-9]+', '-'), '([a-z0-9]+-?){0,5}([a-z0-9]+)') as url_keyword
FROM emp_groups eca, emp_archive a, emp_assignment esa
WHERE eca.emp_group_id = 9
AND eca.emp_id = a.emp_id
AND a.emp_id = esa.emp_id
GROUP BY eca.emp_id, a.title,, REGEXP_SUBSTR(REGEXP_REPLACE(LOWER(a.empword), '[^a-z0-9]+', '-'), '([a-z0-9]+-?){0,5}([a-z0-9]+)')
)
)
WHERE emp_id = 6046935
empid nextempid title date
6235396 6239577 radio engineer 8/5/2015
6239577 6219531 radar engineer 7/16/2015
6219531 6083501 software engineer 7/8/2015
6083501 6141972 Project manager 6/24/2015
6141972 6163194 QA engineer 6/1/2015
6163194 6142464 technician 5/18/2015
6142464 6046935 teacher 4/23/2015
6046935 (null) (null) (null)
需要的结果集
empid nextempid nexttitle nextdate
6235396 6239577 radio engineer 8/5/2015
6239577 6219531 radar engineer 7/16/2015
6219531 6083501 software engineer 7/8/2015
6083501 6141972 Project manager 6/24/2015
6141972 6163194 QA engineer 6/1/2015
6163194 6142464 technician 5/18/2015
6142464 6046935 teacher 4/23/2015
6046935 6235396 doctor 9/5/2015
【问题讨论】:
-
empid = 6235396 的 join_dt 真的是 2015 年 5 月 5 日吗?因为如果将 empid = 6239577 作为下一行,它的日期不应该大于 2015 年 8 月 5 日吗?
-
是的,抱歉打错了,已更新。谢谢
-
您不需要子查询中的差异,顺便说一句!你已经在分组了。
-
我看了那篇文章,不太清楚如何更改列的值?
-
一种方法是更改您的查询以找到每个 emp_id 在将其加入每个查询中的其他表之前的最大 join_date。
标签: sql oracle window-functions