问题:
如何从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
转移日期问题:
目前,我有一个列出xpid
,max(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
输出中的片段:
注意null
值,这些都很好,我们想要这些。我们希望d0
中的每位患者都有一行输出,无论d8
或d1_10
中的行是什么。
提前致谢,如果我能提供更清晰的信息,请告诉我。
其他信息:
尝试按照塞巴斯蒂安的建议添加and units.max_unit <= sessions.max_date
。它已接近,但我们需要max_unit <= max_date
才能获得最大值,而不是按d1_10.dstartdate <= sessions.max_date
进行限制。我们希望它在获取最大值之前限制它从units.max_unit
中选择的池。
@Sebastian,假设xpid = 2500
在d1_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'
,因为这是该患者的最大转移日期,该日期小于该患者的最大会话日期。如果我能更好地清理它,请告诉我。
答案 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
)