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