【发布时间】:2018-04-30 16:56:19
【问题描述】:
我需要在一个 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) 时不使用。
【问题讨论】:
-
请编辑您的问题以显示您目前拥有的 SQL 代码。
-
您可以将
coalesce(END_DATE, DATE '9999-12-31)添加到 Gordon 的查询中以处理新案例。