我们有一个患者数据库,显示他们对我们办公室的各种访问的详细信息,例如他们在访问期间的体重.我想生成一个报告,该报告根据访问日期与患者首次访问之间的差异返回访问(表格中的一行),该访问是可能的最大值但不超过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
Run Code Online (Sandbox Code Playgroud)
在我的查询中,如果我想要将此报告运行"30天",我会希望将该行返回到哪里visit_id = 5,因为它是未来28天,而下一行是未来35天,这太多了.
我已经尝试过各种各样的事情,比如将表连接到自身,或者在WHERE子句中创建子查询以尝试返回createdWHERE等于或小于的最大值created + 30 days,但我似乎不知所措.这点.作为最后的手段,我可以将所有数据拉入PHP数组并在那里构建一些逻辑,但我真的不愿意.
更大的图景是:该数据库有大约5,000名患者,每个患者都有任意数量的办公室访问.我想建立一份报告,告诉我从第一次就诊到X天的所有患者的平均等待损失是什么(即每个患者第一次就诊的X天,而不是任意的X天期间).我希望如果我能解决上述问题,我将能够完成其余工作.
您可以使用如下查询获取第一次和下次访问的日期(请注意,这没有正确的日期比较语法,它只是查询的架构):
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
Run Code Online (Sandbox Code Playgroud)
因此,基本上您需要使用分组依据查找开始日期patient_id,然后加入patient_visits并查找 30 天窗口内的最大日期。
然后您可以将结果连接起来以patient_visits获得开始和结束权重并计算损失。