从员工历史记录表中获取每个职位的员工开始和结束日期

时间:2017-11-17 01:11:03

标签: sql oracle

我需要在一个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)时不会使用。

2 个答案:

答案 0 :(得分:0)

假设没有差距,那么这只是聚合:

select EMP_ID, SYST_LOGIN, POSITION, LOCATION,
       min(start_date) as start_date, max(end_date) as end_date
from t
group by EMP_ID, SYST_LOGIN, POSITION, LOCATION;

答案 1 :(得分:0)

我遇到了和你一样的问题,这是我使用 laravel 及其作用域的方法..

    public function scopeEmploye_Location_By_Year_Month($query, $year, $month)
    {
        $from = date($year . '-' . $month . '-' . '01');
        $to = date($year . '-' . $month . '-' . 't');

        return $query->where(function ($query) use ($from, $to) {
            $query->where('START_DATE', '<=', $from)->where('END_DATE', '>=', $from);
        })->orWhere(function ($query) use ($from, $to) {
            $query->where('START_DATE', '<=', $to)->where('END_DATE', '>=', $to);
        })->orWhere(function ($query) use ($from, $to) {
            $query->where('START_DATE', '>=', $from)->where('END_DATE', '<=', $to);
        })->orWhere(function ($query) use ($from, $to) {
            $query->where('START_DATE', '<=', $from)->where('END_DATE', '=', null);

        });
    }