获得每位医生签署的最新合同

时间:2016-10-24 19:10:54

标签: sql-server

我有下表,其中包含有关医生更新和到期的信息。医院的工作合同:

enter image description here

可以看出,每位医生(Doc_ID)出现不止一次,如果我们考虑在合同到期后(通常)签署一份新医生,这是有道理的。

从这张表中,我想采取每个医生签署的最后一份合同。我的意思是这样的:

Doc_ID  Hire_Date   End_Date
71      8/1/1985    8/1/1995
72      9/15/1992   9/15/2002
73      2/10/1995   2/10/2005
74      12/4/2000   12/4/2010
75      9/1/1985    9/1/1995
76      6/23/1991   6/23/2001

跳过与早期合约相关的行。

我的尝试是这样的:

SELECT TOP 12 Doc_ID, Hire_Date, End_Date
FROM Hire_info
ORDER BY End_Date DESC

这是有效的,因为我知道医院的医生总数,但

  1. 如果不知道会发生什么?
  2. 在我的数据库中,每个人的工作合同都会持续10年,但是如果一个医生被5年合同聘用,会发生什么。使用上面的脚本,这位医生将不止一次出现。
  3. 如何避免这些问题?

3 个答案:

答案 0 :(得分:3)

除了Lamak的方法,这是正确的+1,你可以使用:

SELECT  Doc_ID,
        Hire_Date,
        End_Date
FROM tbl
INNER JOIN 
(SELECT Doc_ID, Max(End_Date) dt FROM tbl GROUP BY Doc_ID) t2 ON
t2.Doc_ID = tbl.Doc_ID and t2.dt = tbl.End_Date

请注意,如果End_Date可以是NULL,因为合同尚未结束,您需要考虑到这一点。

SELECT  Doc_ID,
        Hire_Date,
        End_Date
FROM tbl
INNER JOIN 
(SELECT Doc_ID, Max(ISNULL(End_Date,'12/31/2999')) dt FROM tbl GROUP BY Doc_ID) t2 ON
t2.Doc_ID = tbl.Doc_ID and t2.dt = ISNULL(tbl.End_Date,'12/31/2999')

答案 1 :(得分:2)

您可以使用ROW_NUMBER

WITH CTE AS
(
    SELECT  *,
            RN = ROW_NUMBER() OVER(PARTITION BY Doc_ID ORDER BY Hire_Date DESC)
    FROM dbo.Hire_Info
)
SELECT  Doc_ID,
        Hire_Date,
        End_Date
FROM CTE 
WHERE RN = 1;

答案 2 :(得分:0)

如果您的表具有主键(PK),则可以使用以下脚本。

select Doc_ID,Hire_Date,End_Date from Hire_info H
where H.PK in
(
select top 1 HI.PK from Hire_info HI where HI.Doc_ID = H.Doc_ID
and Hire_Date is not null 
order by Hire_Date desc
)
order by Doc_ID