在递归查询中比较先前查询的结果

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 joinfilter 子句将 return 所有人,无论他们是否达到了 EM 级别。

将此结果加入自身,将每条记录与其 parent 记录连接起来。同样,这是一个 left join,因为层次结构顶部的人不应该有一个 parent。

case 语句可能只是 booleancoalesce 的比较,因为我们只需要 true/false。可能的条件是:

  1. Child 的 first_time_em 在 parent 的 first_time_em 之前,这会产生 true
  2. Child有一个first_time_em而老板没有(null),coalesce()变成9999-12-31,产生true
  3. Child 没有 first_time_em (null),由 else
  4. 产生 false
  5. Child 的 first_time_em 在 parent 的 first_time_em 之后,由 'else`
  6. 产生 false
  7. child 和 parent 都没有 first_time_em,由 else
  8. 产生 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
;