我创建了以下两个查询,以查看表per_assignments和per_supervisor中针对locat_id,org_id,mng_id列的更改。
with asg_loc_dep as (
select person_id,
prev_start_dt,
start_dt,
loc_old,
loc_new,
org_new,
org_old
from (
select person_id,
locat_id loc_new,
org_id org_new,
start_dt,
lag(locat_id) over (partition by person_id order by start_dt) loc_old,
lag(org_id) over (partition by person_id order by start_dt) org_old,
lag(start_dt) over (partition by person_id order by start_dt) prev_start_dt,
case start_dt when 1 + lag(end_dt) over (partition by person_id order by start_dt)
then 1 end flag
from per_assignments
)
where flag = 1
and (loc_new <> loc_old or org_new <> org_old)
)
with asg_asg as (
select person_id,
prev_start_dt,
start_dt,
new_mgr,
mngid_old
from (
select person_id,
mng_id new_mgr,
start_dt,
lag(mng_id) over (partition by assignment_id order by start_dt) mngid_old,
lag(start_dt) over (partition by assignment_id order by start_dt) prev_start_dt,
case start_dt when 1 + lag(end_dt) over (partition by assignment_id order by start_dt)
then 1 end flag
from per_supervisor
)
where flag = 1
and (mngid_old<>new_mgr)
)
我分别得到正确的结果,有没有一种方法可以将这两个查询合并为一个以获得以下输出结构:
person_id prev_start_dt start_dt loc_old loc_new org_new org_old mngid_old new_mgr
这两个查询之间的通用链接是person_id。如果我使用工会,我将为剩下的列传递什么,如果同一日期-prev_start_dt和start_dt的loc_new和new_mgr发生变化,则它应该排在第一行。与工会将它分为两行。
仅在第一个查询中摆弄样本
https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=a3b74f9c4f8371ad23bbf53dcbe41f67
WITH loc_dep AS
(
SELECT person_id,
prev_start_dt,
start_dt,
--assignment_id,
loc_old,
loc_new,
org_old,
org_new
FROM (
SELECT person_id,
assignment_id,
location_id loc_new,
organization_id org_new,
effective_start_date start_dt,
Lag(location_id) OVER (partition BY person_id ORDER BY effective_start_date) loc_old,
Lag(organization_id) OVER (partition BY person_id ORDER BY effective_start_date) org_old,
Lag(effective_start_date) OVER (partition BY person_id ORDER BY effective_start_date) prev_start_dt,
CASE effective_start_date
WHEN 1 + Lag(effective_end_date) OVER (partition BY person_id ORDER BY effective_start_date) THEN 1
END flag
FROM per_all_assignments_m paam
WHERE paam.person_id = '300000010518043'
AND paam.system_person_type = 'EMP'
AND paam.assignment_status_type = 'ACTIVE'
AND paam.assignment_type = 'E' )
WHERE flag = 1
AND (
loc_new <> loc_old
OR org_new <> org_old)) ,
with mgr_compare AS
(
SELECT DISTINCT person_id,
prev_start_dt,
start_dt,
mngr_new,
mngr_old
FROM (
SELECT person_id,
manager_id mngr_new,
effective_start_date start_dt,
effective_end_date end_date,
lag(manager_id) OVER ( partition BY assignment_id ORDER BY effective_start_date) mngr_old,
lag(effective_start_date) OVER ( partition BY assignment_id ORDER BY effective_start_date) prev_start_dt,
CASE effective_start_date
WHEN 1 + lag(effective_end_date) OVER (partition BY assignment_id ORDER BY effective_start_date) THEN 1
END flag
FROM per_assignment_supervisors_f pasf
WHERE pasf.person_id = '300000010518043')
WHERE flag = 1
AND (
mngr_new <> mngr_old ))
SELECT mgr_compare.person_id
FROM mgr_compare,
loc_dep
WHERE loc_dep.person_id = mgr_compare.person_id
您可以将两个CTE放在同一个查询中,然后将结果join
放入person_id
:
with
asg_loc_dep as (
select
person_id,
prev_start_dt,
start_dt,
loc_old,
loc_new,
org_new,
org_old
from ( ... )
where ...
),
asg_asg as (
select
person_id,
prev_start_dt,
start_dt,
new_mgr,
mngid_old
from (...)
where ...
)
select
l.person_id,
l.prev_start_dt,
l.start_dt,
l.loc_old,
l.loc_new,
l.org_new,
l.org_old,
a.mngid_old,
a.new_mgr
from asg_loc_dep l
inner join asg_asg a on a.person_id = l.person_id