3

我的数据库中有一个 EMP 表,其中包含以下字段:

id,name,post,joining_date.

每当任何员工名称发生变化时,都会插入一个带有新名称的新行。意味着如果员工获得任何晋升,他会有多行。现在我想为每个员工明智地指定结束日期。就像我的日期是这样的:

id        name          start_date     post
1          x             24-JAN-05      Software Engineer
2          y             23-JAN-08      Associate Software Engineer
3          x             26-Aug-05      Senior Sofware Engineer
4          y             20-FEB-09      Sofware Engineer

我想要以下格式的数据:

id        name          start_date     end_date        post
1          x             24-JAN-05      26-Aug-05      Software Engineer
2          x             26-Aug-05      null           Senior Software Engineer
3          y             23-JAN-08      20-FEB-09       Associate Software Engineer
4          y             20-FEB-09       null           Software Engineer

因此,我想获取每个员工每个职位的结束日期的数据。我不想使用 PL/SQL。我只想使用查询。我希望它有意义。

4

2 回答 2

4

开始了:

select id, name, start_date, lead(start_date) over (partition by name
order by start_date) as end_date, post from emp;
于 2012-05-27T15:56:09.687 回答
3

您可以LEAD为此使用分析功能

SELECT id,
       name,
       start_date,
       LEAD(start_date) over (partition by name
                                  order by start_date) end_date,
       post
  FROM emp

不过,据推测,在您的真实表中,您可以使用某种形式,EMPLOYEE_ID而不是使用NAME来确定哪些行放在一起。否则,一旦您有两名名为“John Smith”的员工,就会出现问题。

于 2012-05-27T15:57:08.140 回答