You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

T-SQL求助:如何让ROW_NUMBER()从指定预约记录开始编号?

解决方案:从指定就诊记录开始筛选后续预约

没问题,这个需求完全可以实现!你之前的思路方向是对的,但核心问题在于没有先定位到患者前往‘123-45’诊所的那次基准就诊,导致编号从最早的预约开始了。我们可以通过两步筛选来解决这个问题:先锁定目标就诊记录,再以此为起点筛选后续预约并编号。

核心思路

  1. 锁定基准就诊记录:先找出2016年4月1日至2017年3月31日期间,所有前往诊所‘123-45’的患者及其对应的就诊日期,这是我们的起始点。
  2. 筛选基准日之后的预约:将原预约表与基准记录关联,只保留每个患者在基准就诊日期及之后的预约记录。
  3. 按基准起点编号并取前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的作用:用TargetVisits CTE清晰分离出基准记录,让逻辑更易懂;FilteredAppointments则负责筛选和编号,确保编号从基准就诊开始计数。
  • 关联逻辑:通过INNER JOIN保证只处理有目标诊所就诊记录的患者,符合需求里的“曾前往诊所‘123-45’就诊的患者”前提。

如果患者在基准就诊后没有两次后续预约,这个语句也会自动返回实际存在的记录(比如只有基准那次,或者基准+1次后续),不会出现空行。

内容的提问来源于stack exchange,提问作者Jon295087

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:59:11