按最年轻的日期选择复制

时间:2016-08-17 12:06:34

标签: sql

我遇到了麻烦。 A有一个DB,员工有多个startdates。 员工可以开始并可以在以后获得新合同。

FE。

ID   NAME  DATEEMPLOYED FUNCTION
1    Paul  01/01/2016   Director
2    Paul  01/01/2015   Staff Member
3    Jeff  02/05/2016   Director
4    Jeff  01/05/2015   Employee
5    Jeff  01/05/2014   Employee
6    Eric  05/06/2015   Employee

现在我需要从最新和最年轻的日期获取ID。 我想将具有最新日期的行的功能复制到最早的日期,然后删除除最旧日期之外的所有日期。

我能找到的最老的:

SELECT * FROM [database].[dbo].[Personel] t WHERE DATEEMPLOYED NOT IN      (SELECT MAX(DATEEMPLOYED)  AS LastUpdate FROM [database].[dbo].[Personel] GROUP BY Naam,Voornaam)

这会返回10行......

现在找到最年轻的...... 我想,将MAX(DATEEMPLOYED)改为MIN(DATEEMPLOYED)就好了......

但我想不是因为这只会返回6行......

我正在运行一个实时数据库,所以没有样本日期......

每位员工的最大日期查询的预期输出是ID 1和3 ...最小日期的预期输出是ID 2和5 ...... 没有数字6

我正在通过ASP.net应用程序运行MS SQL ... 发布的查询我正在SQL服务器上运行以进行测试... 后来我会适应ASP.Net 我想自动删除重复的员工。

我哪里出错?

2 个答案:

答案 0 :(得分:0)

依赖于您的版本,您可以使用窗口功能

    Declare @YourTable table (ID int,NAME varchar(50),  DATEEMPLOYED Date, [FUNCTION] varchar(50))
    Insert Into @YourTable values
    (1,'Paul','01/01/2016','Director'),
    (2,'Paul','01/01/2015','Staff Member'),
    (3,'Jeff','02/05/2016','Director'),
    (4,'Jeff','01/05/2015','Employee'),
    (5,'Jeff','01/05/2014','Employee'),
    (6,'Eric','05/06/2015','Employee')


;with cteBase as (
    Select Distinct Name 
          ,Times   = count(*) over  (Partition By Name) 
          ,MinID   = min(ID) over (Partition By Name) 
          ,MaxID   = max(ID) over (Partition By Name) 
          ,MinDate = min(DATEEMPLOYED) over  (Partition By Name Order By DATEEMPLOYED) 
          ,MaxDate = max(DATEEMPLOYED) over  (Partition By Name Order By DATEEMPLOYED Desc) 
     From @YourTable
)
Select * from cteBase where Times>1 

返回

Name    Times   MinID   MaxID   MinDate     MaxDate
Jeff    3       3       5       2014-01-05  2016-02-05
Paul    2       1       2       2015-01-01  2016-01-01

答案 1 :(得分:0)

您的数据库是否具有NULL日期,如果需要,您需要检查这些日期。