【问题标题】:Count maximum rows with FK in any 8-week period在任何 8 周内使用 FK 计算最大行数
【发布时间】:2026-02-13 15:20:07
【问题描述】:

similar post 不太符合我的需求。我正在使用 SSMS(SQL 服务器)。我想为 8 周内(ApptDate 到 ApptDate + 56)内患者的预约计数添加一列。解决这个问题的最佳方法是什么? (任何示例代码都将不胜感激。)数据表看起来有点像这样:

ApptID      PatientID    ApptDate 
----------------------------------
Appt1       Pt1          Datetime1
Appt2       Pt1          Datetime2
Appt3       Pt2          Datetime3
...         ...          ...

我希望输出如下所示:

ApptID     PatientID     ApptDate    CountOfVisitInNext8Wks (i.e. Datetime to Datetime+56)
-----------------------------------------------------------
Appt1      Pt1           Datetime1   2
Appt2      Pt1           Datetime2   1
Appt3      Pt2           Datetime3   7
...        ...           ...         ...

我打算使用上面的输出表来创建另一个显示患者最大计数的表:

PatientID   MaxCountOfVisitInNext8Wks
-------------------------------------
Pt1         2
Pt2         7

我的数据集很小,所以效率不是问题。我不知道如何最好地解决这个问题(例如,子查询、上面链接的帖子中的内部连接、带有日期参数的 while 循环)。我是 SQL 的初学者。提前致谢。

【问题讨论】:

    标签: sql sql-server date dynamic aggregate


    【解决方案1】:

    您可以使用apply 或相关子查询:

    select t.*,
           (select count(*)
            from t t2
            where t2.patientId = t.patientId and
                  t2.apptdate >= t.apptdate and
                  t2.apptdate < dateadd(day, 56, t.apptdate)
           ) as cnt_8_weeks
    from t;
    

    请注意,这会计算当天的约会。因此,您可能真的想使用以下方法排除它:

                  t2.apptdate > t.apptdate and
                  t2.apptdate < =dateadd(day, 56, t.apptdate)
    

    确切的逻辑不是 100% 清楚的。

    您可以将此逻辑用作子查询或带有聚合的 CTE,以获得最终结果。

    虽然您不关心性能,但(patientId, apptDate) 上的索引将有利于查询。

    【讨论】:

    • 感谢您的快速、高效的帖子和您的洞察力。我已经接受了你的解决方案,并会尽快尝试实施它。我不确定如何使用 apply 或创建索引(这对我来说都是新的),但我会研究一下。
    • @ChipM 。 . .在这种情况下,apply 将执行与关联子查询相同的操作。