繁体   English   中英

具有条件的行平均值的单个MySQL查询

[英]Single MySQL query with row averages based on conditions

我有问题,我知道如何进行多个查询,但现在真的不知道

我有一张桌子

  BP {
  name: varchar
  systolic : int
  diastolic : int
  timestamp: date
  }

我需要从BP表中获取满足以下任何以下条件的名称。

  1. 如果systolic > 180 OR diastolic > 110
  2. 如果(systolic >= 140 AND systolic < 180) ,则获取下2个收缩压读数,获得平均值,并且如果该平均值> =140。则满足条件。
  3. 同样的舒张压。 如果(diastolic >= 90 AND systolic < 110) ,则获取舒张压的下两个读数,获得平均值,并且如果该平均值> =90。则满足条件。

具有相同唯一name行将会更多。 (意味着每人很多BP记录)。

如果我获得所有值并用PHP自己解析,我当然可以使它工作。

但是我想知道是否有更好的方法可以直接在MySQL中进行。

更新资料

我的目标是找到患有高血压的人。 这些条件超出了将人归为高血压的准则。

在此示例中,我简化了表格。 我想获得那些符合这些高血压指南的人的name(s)

条件1很容易解决。 条件2和条件3困扰着我。 现在,我只是获得systolic >=140 AND systolic < 180的人员列表,根据名称将其过滤掉,按时间戳排序并逐一列举,如果我发现systolic >= 140 AND systolic < 180 ,我中断枚举并检查该名称的下2个读数并取平均值。 我用舒张压重复一下。 并将结果与​​所有三个条件合并,删除所有重复的条目。

这是我目前正在做的。

是的,它可以在MySQL中完成。 我认为甚至可以将它作为SELECT语句来执行(但这将非常复杂,难以维护并且可能非常缓慢)。

由于您目前甚至不确定是否可以在MySQL中执行此操作,并在此处询问,因此我建议在PHP中实施解决方案可能会更好地利用您的时间-您可以从答案中剪切和粘贴代码,这可能会出现给出正确的结果,但是您可以评估解决方案的细微差别吗? 破裂时您能修复它吗? 升级它以适应新功能吗?

如果是我,我将使用MySQL过程将其实现为有限状态机 (实际上是3个FSM,每个条件一个)。 您没有说出满足条件时应采取的措施-但是,如果您仅将事实记录在数据库中,则可以使用简单的SQL语句执行任何操作。 这种方法的另一个优点是,您不需要在每次应用条件时都重新计算所有数据。

我将描述条件2的应用过程。所有3个条件(以及更多条件)都可以在数据的一次传递中实现。 第一个可以通过简单的选择来完成。

1) select the data which has not been previously processed, ordered by name, then timestamp

in a loop:
   2.1) if the name is different from the last stored value, reset s1 and s2
   2.2) if (systolic  >= 140 AND systolic < 180)
      2.2.1) if s1 is set
          2.2.1.1 if s2 is set
               caclulate average if over limit, flag record, reset systolic1 and systolic2
          2.2.1.2 else
               set s2 to current systolic pressure
       2.2.2) else
           set s1 to current systolic pressure
    2.3) else
        reset s1 and s2
 repeat for all records

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM