MySQL - 选择列+ X>的行柱

时间:2015-12-18 07:39:38

标签: mysql

我们有一个患者数据库,显示他们对我们办公室的各种访问的详细信息,例如他们在访问期间的体重。我想生成一个报告,该报告根据访问日期与患者首次访问之间的差异返回访问(表格中的一行),该访问是可能的最大值但不超过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天期间)。我希望如果我能解决上述问题,我将能够完成其余工作。

1 个答案:

答案 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以获取开始和结束权重并计算损失。