在递归查询中比较先前查询的结果
Comparing results of a previous query within a recursive query
我设置了一个查询来查找人员 X 晋升到特定级别的最早时间-
"firsttimeEMplus" AS (
SELECT MIN(ra."EffectiveDate")
FROM rankachievement ra
WHERE ra."NewRank" IN ('Executive Manager',
'Associate Director',
'Director',
'Senior Director',
'Executive Director',
'Managing Director'))
现在我想做的是在我的递归查询中使用这个查询的结果作为 CASE 语句的一部分,我在其中确定 X 是否在 parent 之前被提升。所以,child firsttimeEMplus < parent firsttimeEMplus
SELECT (CASE WHEN (**child**"firsttimeEMplus" <= **parent**"firsttimeEMplus) THEN etc....
但是我很困惑什么语法可以让我像这样比较 parent 和 child,或者我是否可以在 CASE 语句中做这样的事情。如果有人可以提供指导或资源,或者我可以在哪里找到这可能如何工作的示例,我们将不胜感激。谢谢!
这是没有递归的。
我们的想法是获取所有人员及其 first_time_em
日期的列表。使用 left join
和 filter
子句将 return 所有人,无论他们是否达到了 EM 级别。
将此结果加入自身,将每条记录与其 parent 记录连接起来。同样,这是一个 left join
,因为层次结构顶部的人不应该有一个 parent。
case
语句可能只是 boolean
与 coalesce
的比较,因为我们只需要 true
/false
。可能的条件是:
- Child 的
first_time_em
在 parent 的 first_time_em
之前,这会产生 true
- Child有一个
first_time_em
而老板没有(null
),coalesce()
变成9999-12-31
,产生true
- Child 没有
first_time_em
(null
),由 else
产生 false
- Child 的
first_time_em
在 parent 的 first_time_em
之后,由 'else` 产生 false
- child 和 parent 都没有
first_time_em
,由 else
产生 false
with person_achievement as (
select p.person_id, p.parent_id,
MIN(ra."EffectiveDate")
filter (when ra."NewRank" in
('Executive Manager', 'Associate Director', 'Director',
'Senior Director', 'Executive Director', 'Managing Director')
) as first_time_em
from person p
left join rankachievement ra
on ra.person_id = p.person_id
)
select pc.*,
case
when pc.first_time_em < coalesce(pp.first_time_em, '9999-12-31') then true
else false
end as made_em_before_boss
from person_achievement pc
left join person_achievement pp
on pp.person_id = pc.parent_id
;
我设置了一个查询来查找人员 X 晋升到特定级别的最早时间-
"firsttimeEMplus" AS (
SELECT MIN(ra."EffectiveDate")
FROM rankachievement ra
WHERE ra."NewRank" IN ('Executive Manager',
'Associate Director',
'Director',
'Senior Director',
'Executive Director',
'Managing Director'))
现在我想做的是在我的递归查询中使用这个查询的结果作为 CASE 语句的一部分,我在其中确定 X 是否在 parent 之前被提升。所以,child firsttimeEMplus < parent firsttimeEMplus
SELECT (CASE WHEN (**child**"firsttimeEMplus" <= **parent**"firsttimeEMplus) THEN etc....
但是我很困惑什么语法可以让我像这样比较 parent 和 child,或者我是否可以在 CASE 语句中做这样的事情。如果有人可以提供指导或资源,或者我可以在哪里找到这可能如何工作的示例,我们将不胜感激。谢谢!
这是没有递归的。
我们的想法是获取所有人员及其 first_time_em
日期的列表。使用 left join
和 filter
子句将 return 所有人,无论他们是否达到了 EM 级别。
将此结果加入自身,将每条记录与其 parent 记录连接起来。同样,这是一个 left join
,因为层次结构顶部的人不应该有一个 parent。
case
语句可能只是 boolean
与 coalesce
的比较,因为我们只需要 true
/false
。可能的条件是:
- Child 的
first_time_em
在 parent 的first_time_em
之前,这会产生true
- Child有一个
first_time_em
而老板没有(null
),coalesce()
变成9999-12-31
,产生true
- Child 没有
first_time_em
(null
),由else
产生 - Child 的
first_time_em
在 parent 的first_time_em
之后,由 'else` 产生 - child 和 parent 都没有
first_time_em
,由else
产生
false
false
false
with person_achievement as (
select p.person_id, p.parent_id,
MIN(ra."EffectiveDate")
filter (when ra."NewRank" in
('Executive Manager', 'Associate Director', 'Director',
'Senior Director', 'Executive Director', 'Managing Director')
) as first_time_em
from person p
left join rankachievement ra
on ra.person_id = p.person_id
)
select pc.*,
case
when pc.first_time_em < coalesce(pp.first_time_em, '9999-12-31') then true
else false
end as made_em_before_boss
from person_achievement pc
left join person_achievement pp
on pp.person_id = pc.parent_id
;