Oracle SQL – 在select中选择(在同一个表中!)
发布时间:2020-12-12 16:26:30 所属栏目:百科 来源:网络整理
导读:我会尝试解释我想要快速实现的目标,因为我不知道如何解释它! 我们这里有一张表格,显示了所有员工的所有工作经历,我想要当前帖子的“Start_Date”(“Current_Flag”=’Y’).除此之外,我想要之前的帖子的“End_Date”(将按当前标记过滤,按结束日期排序,然后抓
我会尝试解释我想要快速实现的目标,因为我不知道如何解释它!
我们这里有一张表格,显示了所有员工的所有工作经历,我想要当前帖子的“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' 关于如何使这项工作的任何建议都很棒,希望上面的内容有点意义 – 说实话,此刻的查询甚至不会起作用,真的很糟糕,嗯. (编辑:哦!我写这个是为了查询一个现有的系统……由于某种原因,桌子周围有所有愚蠢的双引号和字段名称,叹了口气!) 这正是分析拯救的场景.鉴于此测试数据: 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> 具有分析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> 内联视图对于获得正确的结果至关重要.否则,CURRENT_FLAG上的过滤器将删除先前的行. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |