【问题标题】:Get an employees start and end date for each position from an employee history table从员工历史记录表中获取每个职位的员工开始和结束日期
【发布时间】: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 的查询中以处理新案例。

标签: sql oracle


【解决方案1】:

假设没有间隙,那么这只是聚合:

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;

【讨论】:

  • 所以你是对的,假设没有间隙和重叠,那么这个工作就没有中断。如果您能够查看它,我还有另一种不适用的情况并将其添加到上面。谢谢你的回复!!我很感激。
【解决方案2】:

我遇到了像你这样的问题,这是我使用 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);

        });
    }

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 2021-06-13
  • 2021-11-17
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
相关资源
最近更新 更多