Oracle SQL - 在select中选择(在同一个表中!)

Nic*_*ick 7 sql oracle select join

我会尝试解释我想要快速实现的目标,因为我不知道如何解释它!

我们这里有一张表格,显示了所有员工的所有工作经历,我想要当前帖子的"Start_Date"("Current_Flag"='Y').除此之外,我想要之前的帖子的"End_Date"(将按当前标记过滤,按结束日期排序,然后抓住顶部日期)

所以无论如何,这是我的代码:

SELECT "Gc_Staff_Number",
       "Start_Date",
       (SELECT "End_Date"
        FROM   "Employment_History"
        WHERE  "Current_Flag" != 'Y'
               AND ROWNUM = 1
               AND "Employee_Number" = "Employment_History"."Employee_Number"
        ORDER  BY "End_Date" ASC)
FROM   "Employment_History"
WHERE  "Current_Flag" = 'Y'
Run Code Online (Sandbox Code Playgroud)

关于如何使这项工作的任何建议都很棒,希望上面的内容有点意义 - 说实话,此刻的查询甚至不会起作用,真的很糟糕,嗯.

(编辑:哦!我写这个是为了查询一个现有的系统......由于某种原因,桌子周围有所有愚蠢的双引号和字段名称,叹了口气!)

APC*_*APC 10

这正是分析拯救的场景.

鉴于此测试数据:

SQL> select * from employment_history
  2  order by Gc_Staff_Number
  3             , start_date
  4  /

GC_STAFF_NUMBER START_DAT END_DATE  C
--------------- --------- --------- -
           1111 16-OCT-09           Y
           2222 08-MAR-08 26-MAY-09 N
           2222 12-DEC-09           Y
           3333 18-MAR-07 08-MAR-08 N
           3333 01-JUL-09 21-MAR-09 N
           3333 30-JUL-10           Y

6 rows selected.

SQL> 
Run Code Online (Sandbox Code Playgroud)

具有分析LAG()函数的内联视图提供了正确的答案:

SQL> select Gc_Staff_Number
  2             , start_date
  3             , prev_end_date
  4  from   (
  5      select Gc_Staff_Number
  6             , start_date
  7             , lag (end_date) over (partition by Gc_Staff_Number
  8                                    order by start_date )
  9                  as prev_end_date
 10             , current_flag
 11      from employment_history
 12  )
 13  where current_flag = 'Y'
 14  /

GC_STAFF_NUMBER START_DAT PREV_END_
--------------- --------- ---------
           1111 16-OCT-09
           2222 12-DEC-09 26-MAY-09
           3333 30-JUL-10 21-MAR-09

SQL>
Run Code Online (Sandbox Code Playgroud)

内联视图对于获得正确的结果至关重要.否则,CURRENT_FLAG上的过滤器将删除先前的行.