T-SQL求助:如何让ROW_NUMBER()从指定预约记录开始编号?
解决方案:从指定就诊记录开始筛选后续预约
没问题,这个需求完全可以实现!你之前的思路方向是对的,但核心问题在于没有先定位到患者前往‘123-45’诊所的那次基准就诊,导致编号从最早的预约开始了。我们可以通过两步筛选来解决这个问题:先锁定目标就诊记录,再以此为起点筛选后续预约并编号。
核心思路
- 锁定基准就诊记录:先找出2016年4月1日至2017年3月31日期间,所有前往诊所‘123-45’的患者及其对应的就诊日期,这是我们的起始点。
- 筛选基准日之后的预约:将原预约表与基准记录关联,只保留每个患者在基准就诊日期及之后的预约记录。
- 按基准起点编号并取前3条:对筛选后的记录按患者分组、日期升序编号,最后取编号≤3的记录(包含基准那次就诊和之后两次预约)。
完整SQL语句
WITH TargetVisits AS ( -- 第一步:获取目标时段内前往诊所'123-45'的患者及其就诊日期 SELECT Patient_Id, Appointment_Date AS Target_Date FROM Appointments WHERE Clinic_Code = '123-45' AND Appointment_Date BETWEEN '2016-04-01' AND '2017-03-31' ), FilteredAppointments AS ( -- 第二步:筛选每个患者在基准就诊日期及之后的所有预约,并从基准日开始编号 SELECT a.Patient_Id, a.Clinic_Code, a.Appointment_Date, ROW_NUMBER() OVER ( PARTITION BY a.Patient_Id ORDER BY a.Appointment_Date ASC ) AS Row_No FROM Appointments a INNER JOIN TargetVisits tv ON a.Patient_Id = tv.Patient_Id WHERE a.Appointment_Date >= tv.Target_Date ) -- 第三步:取出每个患者的前3条记录(基准就诊+后续两次) SELECT Patient_Id, Clinic_Code, Appointment_Date, Row_No FROM FilteredAppointments WHERE Row_No <= 3 ORDER BY Patient_Id, Appointment_Date;
关键细节说明
- 日期格式:我把条件里的日期改成了
'YYYY-MM-DD'的标准格式,避免数据库因区域设置不同导致的日期解析错误(比如原写法'01/10/2016'可能被解析为10月1日或1月10日)。 - CTE的作用:用
TargetVisitsCTE清晰分离出基准记录,让逻辑更易懂;FilteredAppointments则负责筛选和编号,确保编号从基准就诊开始计数。 - 关联逻辑:通过
INNER JOIN保证只处理有目标诊所就诊记录的患者,符合需求里的“曾前往诊所‘123-45’就诊的患者”前提。
如果患者在基准就诊后没有两次后续预约,这个语句也会自动返回实际存在的记录(比如只有基准那次,或者基准+1次后续),不会出现空行。
内容的提问来源于stack exchange,提问作者Jon295087
相关产品推荐
相关产品推荐

