我们有一个患者数据库,显示他们对我们办公室的各种访问的详细信息,例如他们在访问期间的体重。我想生成一个报告,该报告根据访问日期与患者首次访问之间的差异返回访问(表格中的一行),该访问是可能的最大值但不超过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
的最大值等于它等于或者不到created + 30 days
,但我现在似乎处于亏损状态。作为最后的手段,我可以将所有数据放入PHP数组并在那里构建一些逻辑,但我真的不愿意。
更大的图景是:该数据库有大约5,000名患者,每个患者都有不同的办公室访问量。我想建立一份报告,告诉我从第一次就诊到X天的所有患者的平均等待损失是什么(即每个患者第一次就诊的X天,而不是任意的X天期间)。我希望如果我能解决上述问题,我将能够完成其余工作。
答案 0 :(得分: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
以获取开始和结束权重并计算损失。