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上的过滤器将删除先前的行.
归档时间: |
|
查看次数: |
88996 次 |
最近记录: |