任务:
d1_10.xtransfer
(数据类型为int)的最大值,并限制此行的d1_10.dstartdate <= glob_End_Date
< / EM> 即可。注意事项:
StackOverflow及其姐妹网站也有类似的问题。我找到的没有成功帮助解决这个问题。
这是一个医学EHR数据库,我可以共享代码,但任何结果讨论都必须是一般的,并排除患者信息。
我在预先存在的Excel电子表格中替换SQL查询以执行不同的操作。 Excel使用ODBC连接从我们的数据库中提取信息。我们的数据库使用的是Ingres SQL,它接受大多数(但不是全部)典型的SQL代码变种。一段代码通常可以在其他版本的SQL中使用,但不能与Ingres和Excel的组合一起使用。我已经让电子表格工作并返回结果,现在它是通过编写适用于该软件的SQL代码来进行一些修复。
到目前为止:
使用下面的当前工作代码(没有最大d1_10.xtransfer
限制),我们会在用户选择的日期范围内返回d1_10.dstartdate
的所有行,并选择用户d1_10.xinstitute
。我们只想要最新的一个。也就是说,患者的行在日期范围内具有最大d1_10.dstartdate
,或者在日期范围内具有最大d1_10.xtransfer
(在添加时计数的索引)。
目前正在运行的代码:
"SELECT " & _
"d1.xpid ""XPID"", " & _
"d0_v1.name_family ""NAME_FAMILY"", " & _
"d0_v1.name_given1 ""NAME_GIVEN1"", " & _
"d0_v1.name_given2 ""NAME_GIVEN2"", " & _
"d1.sex ""SEX"", " & _
"d1.birthdate ""DOB"", " & _
"d0_v1.hsp_pid, " & _
"c58.brief_name, " & _
"c73.cname, " & _
"date_trunc('day',d1_10.dstartdate) ""DSTARTDATE"", " & _
"date_trunc('day',d1_17.ddeath) ""DDEATH"" " & _
"FROM d1 " & _
"JOIN d0_v1 ON d1.xpid = d0_v1.xpid " & _
"JOIN d1_2 ON d1.xpid = d1_2.xpid " & _
"JOIN c58 ON d1_2.xmodality = c58.xcmodality " & _
"JOIN d1_10 ON d1.xpid = d1_10.xpid " & _
"JOIN c73 ON d1_10.xinstitute = c73.xcsite " & _
"JOIN d1_17 ON d1.xpid = d1_17.xpid " & _
"WHERE " & _
"d1_10.xinstitute = " & institute_index & " AND " & _
"d1_10.dstartdate >= '" & glob_Start_Date & " 00:00:00' and " & _
"d1_10.dstartdate <= '" & glob_End_Date & " 23:59:59' "
我从excel电子表格中运行的代码最接近WHERE子句中的这一附加行:
d1_10.xtransfer = (SELECT MAX(d1_10.xtransfer) FROM d1_10 GROUP BY xpid)
通过这个额外的行,我们现在只返回每个患者在日期范围内d1_10.xtransfer
的一行。 但如果他们有一行d1_10.xtransfer
比日期范围更新,那么他们根本不会显示在结果中。
使用此行代码在应用日期限制之前为每个xpid采用MAX(d1_10.xtransfer)
。根据我的逻辑,我们希望它在相反之后这样做,但我无法提出运行的代码,使其比这更接近。
提前致谢。我将在此分页符下方的其他信息中更新此问题。
其他信息:
是的,xpid
是患者ID索引号,对每位患者都是唯一的。
在WHERE子句中添加/编辑了行:"d1_10.xtransfer = (SELECT MAX(xtransfer) FROM d1_10 d1_10_b WHERE d1_10.xpid = d1_10_b.xpid AND d1_10_b.dstartdate <= '" & glob_End_Date & " 23:59:59') "
患者Bob在6月14日和17日都有转移,符合其他标准。
当输入结束日期为Jun 17+的日期范围时,电子表格会正确地为Bob返回他的Jun 17转移行。
输入结束日期为Jun 14,15或16的日期范围时,电子表格错误地不会为Bob返回一行。
似乎在按日期限制之前仍然需要最大的xtransfer。
我为特定患者运行了子选择如下:
输入:
SELECT MAX(xtransfer) FROM d1_10 d1_10_b WHERE d1_10_b.xpid = '2258' AND d1_10_b.dstartdate <= '20-apr-2016 23:59:59'
输出值MAX(xtransfer) = '48233'
。 这是正确的。
因此,当在Visual SQL中作为自己的语句运行时,将d1_10_b.xpid
设置为等于特定患者,它会正确地从日期范围中提取最大的xtransfer。 (日期范围之外有一个更新的xtransfer
,它仍然可以在日期范围内正确显示最大xtransfer
。)
然后我尝试在电子表格的关闭位置运行这个完全相同的子选择。也就是说,我手动选择了相同的日期范围(正确且成功地将其作为变量传递),但我为d1_10.xpid = d1_10_b.xpid
提供了d1_10_b.xpid = '2258'
。 这不起作用。电子表格没有显示该患者的行,似乎是因为它在应用子查询中的日期范围之前仍然应用MAX()函数。然而,子查询在单独运行时起作用。
对任何进一步的建议表示赞赏。
答案 0 :(得分:1)
您需要在子选择和主查询中添加日期限制。我也怀疑这个小组错了。通过添加一个组,使子选择一个患者列表,每个xpid具有最大值的转移值(标识患者?)。但是,这意味着如果您对主查询感兴趣的行恰好具有与属于不同xpid的最大值匹配的xtransfer值,那么您将获得错误匹配。
您真正需要的是在子选择中将xpid上的连接添加回主查询。要做到这一点,你需要一个不同的相关名称,例如
d1_10.xtransfer = (SELECT MAX(xtransfer)
FROM d1_10 d1_10_b
WHERE d1_10.xpid = d1_10_b.xpid
AND d1_10_b.dstartdate > = ... {as above} )