MySQL - 选择行,其中列 + X > 列

6
我们有一个患者数据库,显示了他们在我们诊所的各种就诊细节,例如他们在那次就诊时的体重。我想生成一份报告,根据该就诊日期与患者首次就诊日期之间的差异返回该就诊(来自表格的一行),使其尽可能大但不超过X天。
这很令人困惑,让我举个例子。假设我有以下名为patient_visits的表:
visit_id | created             | patient_id | weight
---------+---------------------+------------+-------
       1 | 2006-08-08 09:00:05 |         10 |    180
       2 | 2006-08-15 09:01:03 |         10 |    178
       3 | 2006-08-22 09:05:43 |         10 |    177
       4 | 2006-08-29 08:54:38 |         10 |    176
       5 | 2006-09-05 08:57:41 |         10 |    174
       6 | 2006-09-12 09:02:15 |         10 |    173

在我的查询中,如果我想要运行这份报告达到"30天"的目的,我将希望返回visit_id = 5的行,因为它是未来28天,而下一行是未来35天,这太多了。
我尝试了各种方法,例如将表格自连接,或在WHERE子句中创建一个子查询以尝试返回created + 30天等于或小于created的最大值,但现在似乎陷入了困境。最后的备选方案是将所有数据提取到PHP数组中,并在那里构建一些逻辑,但我真的不想那样做。
更大的问题是:数据库有约5000名患者,每个患者都可能有任意数量的就诊记录。我想构建报告,告诉我从他们的第一次访问到X天之间(也就是从每个单独患者的第一次访问开始算起的X天,而不是任意的X天期限),所有患者共同的平均等待时间损失。我希望如果我能解决上述问题,我将能够解决其余的问题。

让我来重新表述一下:对于每个患者的ID,我们应该选择最早的就诊记录(称之为锚点),然后找到另一个距离锚点最远但不超过X天的就诊记录。所有其他就诊记录(即那些接近锚点和超过X天的记录)都应该被舍弃。对吗? - Kuba Wyrostek
1个回答

0
您可以使用以下查询获取第一次和下一次访问的日期(请注意,这并没有正确的日期比较语法,只是查询的模式):
select
    first_visits.patient_id,
    first_visits.date first_date,
    max(next_visit.created) next_date
from (
    select patient_id, min(created) as "date"
    from patient_visits
    group by patient_id
) as first_visits
inner join patient_visits next_visit
  on (next_visit.patient_id = first_visits.patient_id 
      and next_visit.created between first_visits.created and first_visits.created + 30 days)
group by first_visits.patient_id, first_visits.date

基本上你需要使用 patient_id 分组查找开始日期,然后连接 patient_visits 并查找在 30 天窗口内的最大日期。

然后你可以将结果连接到 patient_visits,以获取开始和结束体重并计算损失。


这似乎是朝着正确的方向发展。我已经能够改变一些东西,使它成为可执行的查询,并且它确实返回了适当的日期,在1.02秒内完成。但是我在连接方面遇到了两个问题。第一个是速度...它需要64秒才能执行。第二个是我无法弄清楚如何连接下一个访问..我无法连接到一个表格“ON max(next_visit.created)”或“ON next_date”。 - Nick Coons

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接