2013-12-17 92 views
2

我有一个SQL Server 2008表,其中有列Designationid和​​。我想根据日期查找加入的指定ID。我不知道如何。从表中查找最小日期值

我的SQL Server表的结构是这样的:

Designationid NewDesignationID UniqueID EmployeeID FromDate ToDate Comments ApprovedDate ModifiedBy ModifiedDate StatusID ChangeTo CreatedBy CreatedDate 
12 25 258 1700 7/19/2011 7/27/2011 Designation Change 7/28/2011 61 7/28/2011 8 Executive - HR - Associate Executive - HR 61 7/28/2011 
25 132 458 1700 7/28/2011 6/27/2012 Designation Change 6/28/2012 1700 6/28/2012 8 Associate Executive - HR To RMG Executive 1700 6/28/2012 
25 132 510 1700 7/13/2012 8/2/2012 Designation Change 8/3/2012 1700 8/3/2012 8 Associate Executive - HR To RMG Executive 1700 8/3/2012 
132 25 507 1700 6/28/2012 7/12/2012 Designation Change 7/13/2012 1896 7/13/2012 8 RMG Executive To Associate Executive - HR 1896 7/13/2012 

我也想这样做,对于每一个具体EmployeeId。目前我已经完成了一个EmployeeId

+0

我想根据日期查找加入的指定ID。 这件事我不清楚,你想加入哪个列和基于哪个date.show输出。 – KumarHarsh

回答

2

如果你只需要一个行,你可以使用top 1order by ...

select top 1 
    Designationid, NewDesignationID 
from <Table> 
order by FromDate asc 

如果你想这对每一位员工,你可以使用row_number()功能:

;with cte as (
    select *, row_number() over(partition by EmployeeID order by FromDate asc) as rn 
) 
select 
    EmployeeID, Designationid, NewDesignationID 
from cte 
where rn = 1 

里有一些在你的问题中的微妙之处,这个问题在很多时候都进行过讨论。其中一个问题是 - 如果您有两条记录具有相同的FromDate和相同的EmployeeID,那么您希望得到两条记录还是只有一条(如果您需要一条记录,那么您需要哪条记录?)。如果你想两行,你可以使用的方法是这样的:

select 
    T.EmployeeID, T.Designationid, T.NewDesignationID 
from <Table> as T 
where 
    not exists (
     select * 
     from <Table> as TT 
     where TT.EmployeeID = T.EmployeeID and TT.FromDate < T.FromDate 
    ) 

select 
    T.EmployeeID, T.Designationid, T.NewDesignationID 
from <Table> as T 
where 
    exists (
     select 1 
     from <Table> as TT 
     group by TT.EmployeeID 
     having min(TT.FromDate) = T.FromDate 
    ) 

如果你想只有一个,你可以使用row_number()(见上文)或outer apply

select 
    T.EmployeeID, TT.Designationid, TT.NewDesignationID 
from (select distinct TT.EmployeeID from <Table> as TT) as T 
    outer apply (
     select top 1 
      TT.Designationid, TT.NewDesignationID 
     from <Table> as TT 
     where TT.EmployeeID = T.EmployeeID 
     order by TT.FromDate asc 
    ) as TT 
+0

我觉得CTE查询simple.so WHERE没有fromdate IS NOT NULL我已经修改了它并实现它作为EmployeeDesignationChange为 ( \t SELECT ROW_NUMBER()OVER(PARTITION BY雇员ORDER BY FROM日期)AS STARTLEVEL,* \t FROM tbl_PM_EmployeeDesignation_Change ) SELECT employeeid,designationid FROM EmployeeDesignationChange WHERE StartLevel = 1; – SidD

0

尝试这种结构(您的样品不清楚)

SELECT EmployeeID, 
     min(FromDate) 
FROM [EmployeeTable] 
GROUP BY EmployeeID 
+0

我已经做了这个,但我想要指定id – SidD