如何从少于另一个表格的最新日期中选择最长日期?

时间:2017-09-06 14:32:42

标签: sql subquery max aggregate ingres

问题:

如何从max(d1_10.dstartdate)中少于每个xpid的所选日期中为每个d1_10(患者ID)选择xpid(最新的单位转移日期) {' s max(d8.start_date)(最近的会话日期)?

的信息:

表:

  • d0患者列表,每xpid(患者)包含1行
    • d0.xpid唯一患者ID
  • d8会话表,每个会话每行xpid包含1行
    • d8.xpid患者ID
    • d8.start_date会话开始日期
  • d1_10单位转移表,每次转移包含1行xpid
    • d1_10.dstartdate转移日期

问题:

目前,我有一个列出xpidmax(d8.start_date)max(d1_10.startdate)的查询。但是,max(d1_10.startdate)并不一定小于max(d8.start_date)

目标是列出所有患者,他们的最新会话日期以及他们最新的转会日期,这些日期仍然在会话日期之前。目前转移日期与会话日期无关。

我已经尝试嵌套连接查询,但是还没有能够找出调用变量的范围。

进度:

这是我最接近的运行代码:

select distinct
    d0.xpid,
    sessions.max_date,
    units.max_unit
from d0
    left join
        (
            select xpid, max(start_date) as max_date
            from d8
            group by xpid
        ) as sessions on sessions.xpid = d0.xpid
    left join
        (
            select xpid, max(d1_10.dstartdate) as max_unit
            from d1_10
            group by xpid
        ) as units on units.xpid = d0.xpid
输出中的

片段:

Output Sample

注意null值,这些都很好,我们想要这些。我们希望d0中的每位患者都有一行输出,无论d8d1_10中的行是什么。

提前致谢,如果我能提供更清晰的信息,请告诉我。

其他信息:

  • 尝试按照塞巴斯蒂安的建议添加and units.max_unit <= sessions.max_date。它已接近,但我们需要max_unit <= max_date才能获得最大值,而不是按d1_10.dstartdate <= sessions.max_date进行限制。我们希望它在获取最大值之前限制它从units.max_unit中选择的池。

  • @Sebastian,假设xpid = 2500d1_10中有3行d1_10.dstartdate in ('01-jan-2017', '01-feb-2017', '01-mar-2017')max(d8.start_date) = '10-feb-2017'

    根据您的建议max_unit is null,因为max(d1_10.dstartdate) = '01-mar-2017',但'01-mar-2017 > '10-feb-2017'

    我们需要在取得最大值之前限制d1_10.dstartdate <= max(d8.start_date)。期望值应为max_unit = '01-feb-2017',因为这是该患者的最大转移日期,该日期小于该患者的最大会话日期。如果我能更好地清理它,请告诉我。

1 个答案:

答案 0 :(得分:1)

添加

AND d1_10.max_unit < sessions.max_date 

到第二个左连接的on子句就足够了。

编辑完成后,请尝试一下:

SELECT  d0.xpid,
        d8.[start_date],
        d1_10.dstartdate
FROM d0
LEFT JOIN d8
    ON d0.xpid = d8.xpid
LEFT JOIN d1_10
    ON d1_10.xpid = d8.xpid
    AND d1_10.dstartdate = (
                                SELECT MAX(u1.dstartdate)
                                FROM d1_10 as u1
                                WHERE d8.xpid = u1.xpid 
                                AND u1.dstartdate <= d8.start_date
                                GROUP BY u1.xpid
                            )