【问题标题】:MySQL - Select row with column + X > columnMySQL - 选择列 + X > 列的行
【发布时间】:2016-03-24 20:49:35
【问题描述】:

我们有一个患者数据库,其中显示了他们多次访问我们办公室的详细信息,例如他们在访问期间的体重。我想生成一份报告,根据访问日期与患者首次访问日期之间的差异(可能是最大值但不超过 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 的最大值,其中它等于或小于@ 987654326@,但我现在似乎不知所措。作为最后的手段,我可​​以将所有数据拉入一个 PHP 数组并在那里构建一些逻辑,但我真的不想这样做。

更大的图景是这样的:数据库有大约 5,000 名患者,每名患者的就诊次数不限。我想建立报告来告诉我从第一次就诊到 X 天后所有患者的平均等待损失是多少(也就是说,从每个患者第一次就诊开始的 X 天,而不是任意的 X 天时间段)。我希望如果我能解决上述问题,我就能解决剩下的问题。

【问题讨论】:

  • 让我换种说法:对于每个患者 ID,应该进行 最早 访问(我们称之为 anchor),然后找到另一个访问 anchor i>距离锚点最远的,但距离锚点不超过 X 天。所有其他访问(即那些更接近锚点和 X 天以上的访问)应被丢弃。对吗?

标签: mysql


【解决方案1】:

您可以使用这样的查询获取第一次和下一次访问的日期(请注意,这没有正确的日期比较语法,它只是查询的架构):

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

【讨论】:

  • 这似乎是朝着正确的方向发展。我能够更改上面的一些内容以使其成为可执行查询,并且它确实会在 1.02 秒内返回适当的日期。我在连接方面有两个问题。首先是速度。执行需要 64 秒。二是不知道怎么加入下次访问。。不能加入表ON max(next_visit.created)ON next_date
猜你喜欢
  • 2016-08-28
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
相关资源
最近更新 更多