2016-10-24 17 views
1

我有以下表,保存有關更新和醫生的勞動合同到期在醫院的信息:獲取每名醫生簽署的最新的合同

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年合同聘用,會發生什麼情況。使用該醫生的腳本將會出現不止一次。

我該如何避免這些問題?

+0

因爲,我認爲,SS 2012+,看看'Last_Value' - https://msdn.microsoft.com/en-us/library/hh231517.aspx –

回答

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') 
+0

真是太爽了!答案+1 –

+0

謝謝@JohnBus​​tos :) – scsimon

+0

「Group By」的使用非常簡潔。非常聰明的方式來做到這一點。謝謝!! – Jazz

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; 
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