MSSQL查找过去一年内所见人员最近访问的最新测量值

MSSQL查找过去一年内所见人员最近访问的最新测量值,sql,sql-server,join,nested,Sql,Sql Server,Join,Nested,我能想到的唯一一个普通的例子是,看医生的人总是试图降低病人的体温,所以我希望看到最低的读数 patients.patient\u ID,patients.doc\u ID 就诊。就诊ID,就诊。患者ID,就诊。医生ID,就诊。日期时间 vitals.vitals\u ID,vitals.visit\u ID,vitals.patient\u ID,vitals.temp,vitals.datetime doctor.doc\u ID,doctor.name select patients.pat

我能想到的唯一一个普通的例子是,看医生的人总是试图降低病人的体温,所以我希望看到最低的读数

patients.patient\u ID,patients.doc\u ID

就诊。就诊ID,就诊。患者ID,就诊。医生ID,就诊。日期时间

vitals.vitals\u ID,vitals.visit\u ID,vitals.patient\u ID,vitals.temp,vitals.datetime

doctor.doc\u ID,doctor.name

select patients.patient_ID, last_visit.temp, last_visit.maxdate  
from patients  
inner join doctor on patients.doc_ID = doctor.doc_ID  
inner join (  
    select visits.patient_ID, last_vitals.temp, max(visits.datetime) as maxdate  
    from visits  
    inner join (  
        select vitals.visit_ID, vitals.temp, max(vitals.datetime) as maxvitals
        from vitals
        group by vitals.visit_ID, vitals.temp
        )  as last_vitals on visits.visit_ID = last_vitals.visit_ID
    group by visits.patient_ID, visits.datetime  
    having visits.datetime >= DATEADD(mm, -12, GETDATE())  
    ) as last_visit on patient.patient_ID = last_visit.patient_ID  

where doctor.name = 'Dr. Jones'  
我的任何尝试最终都会返回太多的结果。我不知道我是否应该嵌套连接以获得最近访问的最新温度?如果是这样的话,我是先参加探视,然后参加vitals,还是反过来?还是我完全没有正确地处理这个问题


任何新的想法都是值得赞赏的。

我将以完全不同的方式处理这个问题。你有三个问题要解决

  • 过去12个月,每位医生的人均就诊次数最多是多少
  • 每次就诊的最新测量结果是什么
  • 仅显示Jones博士作为初级保健医生的结果
  • 前两个问题可以通过视图或CTE解决,然后结合起来解决。我建议使用不同的视图,这样您就可以改进您的应用程序逻辑(如果mostrecent的定义发生了任何变化,您就可以更新该视图)。下面是一个CTE示例,可以在一个地方看到所有内容:

    旧版:

    基于每位患者每位医生的新信息:


    我将以完全不同的方式处理这个问题。你有三个问题要解决

  • 过去12个月,每位医生的人均就诊次数最多是多少
  • 每次就诊的最新测量结果是什么
  • 仅显示Jones博士作为初级保健医生的结果
  • 前两个问题可以通过视图或CTE解决,然后结合起来解决。我建议使用不同的视图,这样您就可以改进您的应用程序逻辑(如果mostrecent的定义发生了任何变化,您就可以更新该视图)。下面是一个CTE示例,可以在一个地方看到所有内容:

    旧版:

    基于每位患者每位医生的新信息:


    对于您想要的内容,
    row\u number()
    似乎应该是解决方案的一部分。这将枚举行(比如患者)并对它们进行排序(比如按重要时间戳),并分配序列号。您希望将它们反向排列,然后选择第一个

    查询的结构如下所示:

    select t.*
    from (select *,
                 ROW_NUMBER() over (partition by patient_id order by vitals.datetime desc) as seqnum
          from patients p join
               doctor d
               on p.doc_ID = d.doc_ID join
               visits vis
               on vis.patient_id = p.patient_id join
               vitals v
               on vit.visit_id = vis.visit_id
          where doctor.name = 'Dr. Jones'
         ) t
    where seqnum = 1;
    

    我发现很难理解你的逻辑。这将使用vitals时间戳进行排序。例如,您想要那个还是访问时间戳?

    对于您想要的内容,
    行号()
    似乎应该是解决方案的一部分。这将枚举行(比如患者)并对它们进行排序(比如按重要时间戳),并分配序列号。您希望将它们反向排列,然后选择第一个

    查询的结构如下所示:

    select t.*
    from (select *,
                 ROW_NUMBER() over (partition by patient_id order by vitals.datetime desc) as seqnum
          from patients p join
               doctor d
               on p.doc_ID = d.doc_ID join
               visits vis
               on vis.patient_id = p.patient_id join
               vitals v
               on vit.visit_id = vis.visit_id
          where doctor.name = 'Dr. Jones'
         ) t
    where seqnum = 1;
    

    我发现很难理解你的逻辑。这将使用vitals时间戳进行排序。例如,您想要那个还是就诊时间戳?

    问题,您的数据表使人看起来好像有一位主治医生,但他们的就诊可能由另一位医生执行,而且就诊时采集的生命体征可能在另一位患者身上。特别是最后一种情况似乎没有意义。问题是,您的数据表显示,一个人似乎有一位主治医生,但他们的就诊可能由另一位医生进行,而且就诊时采集的生命体征可能来自另一位患者。特别是最后一种情况似乎没有什么意义。一名患者可以被其他医生看到,但有一名医生被指定为患者的主要医生。那么,您是希望每位患者最近一次就诊还是每位患者每次就诊?在这一点上,CTE或视图中列出的每个案例的定义都是有利的。。。就个人而言,它们是简单的查询和易于维护的。我应该把这些假设放在其中:一个患者有一个初级护理提供者,而其他人可能是就诊时的呈现提供者。所有主键都是随机数-因此max(b.visitid)不起作用。但是max(visions.datetime)是这样的,所以我想找到Henry医生的所有患者(Henry=patients.doc_id)和患者最近的体温记录,Henry医生是这个问题的渲染提供者(Henry=visions.doc_id),最后的更新是我可以证明的。你应该明白我的方法的意义。。。如果你喜欢,就用它。将每个概念定义为一个视图,然后针对它进行连接,以将基本连接限制在您想要的范围内。祝你好运,谢谢。我真的很感谢你的帮助。我从没听说过普通的餐桌用语。我正在阅读他们,以确保我能够理解这个概念,然后回顾您的解决方案。一名患者可以被其他医生看到,但其中一名被指定为患者的主要医生。那么,您希望每个患者最近一次就诊,还是每个患者每个医生最近一次就诊?在这一点上,CTE或视图中列出的每个案例的定义都是有利的。。。就个人而言,它们是简单的查询和易于维护的。我应该把这些假设放在其中:一个患者有一个初级护理提供者,而其他人可能是就诊时的呈现提供者。所有主键都是随机数-因此max(b.visitid)不起作用。但是max(visions.datetime)是这样的,所以我想找到Henry医生的所有患者(Henry=patients.doc_id)和患者最近的体温记录,Henry医生是这个问题的渲染提供者(Henry=visions.doc_id),最后的更新是我可以证明的。你应该明白我的方法的意义。。。如果你喜欢,就用它。将每个概念定义为一个视图,然后针对它进行连接,以将基本连接限制在您想要的范围内。祝你好运,谢谢。我真的很感谢你的帮助。我