MySQL - 选择列 + X > 列的行

标签 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 的行,因为它是 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/

相关文章:

mysql - Symfony Doctrine (mysql)锁逻辑

php - mysqli_result::free 增加 php 内存使用

mysql - Activiti mysql 性能调优(索引)

PHP和MySQL日历问题

mysql - Netbeans无法正常连接MySQL数据库的原因是什么?

mysql - Windows批处理脚本2种情况

Mysql 使用 join 打印各个组的总计

php - 每月重置 MySql 列值

php - 如何使用mysql按月获取值的总和

java - 在Java中执行多重查询时出错