我需要在一个SQL查询中有一行输出,其中包含员工每个职位的开始日期和结束日期 .
当前的表结构是:
| EMP_ID | SYST_LOGIN | TEAM | POSITION | LOCATION | START_DATE | END_DATE |
|--------|------------|------|----------|----------|------------|----------|
| 123456 | FNAM.LNAM | A | POS1 | LOC1 | 01-JAN-17 | 31-JAN-17|
| 123456 | FNAM.LNAM | A | POS1 | LOC2 | 01-FEB-17 | 15-FEB-17|
| 123456 | FNAM.LNAM | B | POS1 | LOC2 | 16-FEB-17 | 15-MAR-17|
| 123465 | FNAM.LNAM | C | POS2 | LOC2 | 16-MAR-17 | NULL |
我需要输出:
| EMP_ID | SYST_LOGIN | POSITION | LOCATION | START_DATE | END_DATE |
|--------|------------|----------|----------|------------|-----------|
| 123456 | FNAM.LNAM | POS1 | LOC2 | 01-JAN-17 | 15-MAR-17 |
| 123465 | FNAM.LNAM | POS2 | LOC2 | 16-MAR-17 | NULL |
构建了新的员工表,并要求业务对员工的所有更改在表中创建新记录,而不是仅更新新位置 . 所以现在我想看一下员工职位并知道开始日期和结束日期 . 谢谢您的帮助 .
Gordon Linoff的查询对此有用 .
更新了我遇到的第二个场景
| EMP_ID | SYST_LOGIN | TEAM | POSITION | LOCATION | START_DATE | END_DATE |
|--------|------------|------|----------|----------|------------|----------|
| 123456 | FNAM.LNAM | A | POS1 | LOC1 | 01-JAN-17 | 31-JAN-17|
| 123456 | FNAM.LNAM | A | POS1 | LOC2 | 01-FEB-17 | 15-FEB-17|
| 123456 | FNAM.LNAM | B | POS1 | LOC2 | 16-FEB-17 | NULL |
使用Gordon Linoff的查询,他给出了以下内容:
选择EMP_ID,SYST_LOGIN,POSITION,LOCATION,min(start_date)作为start_date,max(end_date)作为end_date从t组通过EMP_ID,SYST_LOGIN,POSITION,LOCATION
使用这个我得到以下结果:
| EMP_ID | SYST_LOGIN | POSITION | LOCATION | START_DATE | END_DATE |
|--------|------------|----------|----------|------------|-----------|
| 123456 | FNAM.LNAM | POS1 | LOC2 | 01-JAN-17 | 15-FEB-17 |
由于员工仍然处于活动状态,因此最后一条记录的END_DATE为NULL,并且在使用max(END_DATE)时不会使用 .
1 回答
假设没有差距,那么这只是聚合: