我们有一个患者数据库,其中显示了他们对我们办公室的各种访问的详细信息,例如他们在访问期间的体重。我想生成一个报告,根据访问日期和患者第一次访问的日期之间的差异(可能的最大值但不超过 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
的行,因为它是 future 28 天,而下一行是 future 35 天,这太多了。
我尝试了多种方法,例如将表连接到自身,或者在 WHERE
子句中创建子查询以尝试返回 created
的最大值> WHERE 等于或小于 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
所以基本上您需要使用按 patient_id
分组找到开始日期,然后加入 patient_visits
并找到 30 天窗口内的最大日期。
然后您可以将结果加入 patient_visits
以获得开始和结束权重并计算损失。
关于MySQL - 选择列 + X > 列的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34350621/