我有下表,其中包含有关医生更新和到期的信息。医院的工作合同:
可以看出,每位医生(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
这是有效的,因为我知道医院的医生总数,但
如何避免这些问题?
答案 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