基于条件的行平均值的单个MySQL查询

基于条件的行平均值的单个MySQL查询,mysql,Mysql,我有一个问题,我知道如何处理多个查询,但现在不知道 我有一张桌子 BP { name: varchar systolic : int diastolic : int timestamp: date } 我需要从BP表中获取满足以下任何条件的名称 如果收缩压>180或舒张压>110 如果(收缩压>=140和收缩压=140。然后条件满足 同样的舒张期。如果(舒张压>=90和收缩压=90。然后条件满足 将有更多行具有相同的唯一名称。(意味着每人有许多BP记录)。 如果我得到所

我有一个问题,我知道如何处理多个查询,但现在不知道

我有一张桌子

  BP {
  name: varchar
  systolic : int
  diastolic : int
  timestamp: date
  }
我需要从BP表中获取满足以下任何条件的名称

  • 如果收缩压>180或舒张压>110
  • 如果
    (收缩压>=140和收缩压<180)
    ,则取下2个收缩压读数,得到平均值,如果该平均值>=140。然后条件满足
  • 同样的舒张期。如果
    (舒张压>=90和收缩压<110)
    ,则取下2个舒张压读数,得到平均值,如果该平均值>=90。然后条件满足
  • 将有更多行具有相同的唯一
    名称
    。(意味着每人有许多BP记录)。 如果我得到所有的值并自己用PHP解析它,我当然可以让它工作

    但是我想知道是否有更好的方法直接在MySQL中实现

    更新 我的目标是找到高血压患者。而这些情况在将一个人归类为高血压时超出了指导原则

    在这个例子中,我简化了表格。我想知道那些符合这些指南的人的名字

    条件1很容易解决。条件2和3是困扰我的。现在,我只需获得收缩压
    systolic>=140和收缩压<180
    的人的列表,根据姓名筛选出他们,按时间戳排序,并对每组进行枚举,如果我找到收缩压
    systolic>=140和收缩压<180
    ,我将打破枚举,检查该姓名的接下来两个读数,并取平均值。 我用舒张期重复一遍。并将结果与所有三个条件合并,删除任何重复项


    这就是我目前所做的

    是的,可以在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
    
    1)选择之前未处理的数据,按名称排序,然后按时间戳排序
    在循环中:
    2.1)如果名称与上次存储的值不同,则重置s1和s2
    2.2)如果(收缩压>=140,收缩压<180)
    2.2.1)如果设置了s1
    2.2.1.1如果设置了s2
    计算超限时的平均值,标记记录,重置systolic1和systolic2
    2.2.1.2其他
    将s2设置为当前收缩压
    2.2.2)其他
    将s1设置为当前收缩压
    2.3)其他
    重置s1和s2
    对所有记录重复此操作
    
    假设每个患者姓名有多个读数?请向我们提供样本数据和预期结果。定义下两个读数的含义。与我们分享您已经完成的工作和收到的任何错误消息。您的部分“然后读取systolic的下两个读数”意味着我们检查数据库中的下两行的systolic列?在我们为您的问题提供查询之前,请详细说明一下。对于数据库引擎的设计来说,“阅读下面的两个阅读资料”并不是一项很好的工作。它可以通过使用
    JOIN
    s来实现,但得到的只是一个庞大的查询。我将把您列出的简单条件放入一个简单的查询中,该查询从数据库中获取数据,然后用PHP分析返回的每一行,检测其类型(1、2或3),并运行其他查询以获取“下两个读数”并计算其平均值。另一个好方法是从需要分析的时间间隔中获取所有记录(您可能还必须按
    名称
    )进行过滤,按
    时间戳
    升序排序,并进行所有计算(比较和平均值)在PHP中。我应该看看如何创建这些存储过程。我目前都是在PHP上解析的。但我想知道这样做在SQL中是否有意义。从技能的角度看,没有。从性能的角度看,是的,在SQL中处理这一点的粗略想法会很好?我会学到一些东西。