任务:
- 附加/编辑下面当前工作的代码,以仅返回每个患者一行, (datatype int)的最大值
d1_10.xtransfer
d1_10.dstartdate <= glob_End_Date
,该行的.
注意事项:
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
比日期范围更近,那么他们根本不会出现在结果中。
使用这一行代码MAX(d1_10.xtransfer)
在应用日期限制之前为每个 xpid 获取。根据我的逻辑,我们希望它在之后这样做,但我一直无法想出运行它的代码比这更接近。
提前致谢。我将使用此分页符下方的其他信息来更新此问题。
附加信息:
- 根据 PaulM:
是的,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 日进行了符合其余标准的转移。
当输入结束日期为 6 月 17 日+ 的日期范围时,电子表格会正确地为 Bob 的 6 月 17 日转账返回一行。
输入结束日期为 6 月 14 日、15 日或 16 日的日期范围时,电子表格错误地没有为 Bob 返回一行。
似乎在按日期限制之前仍然需要最大 xtransfer。
- 根据 PaulM 的评论:
我为特定患者运行了子选择,如下所示:
输入:
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
日期范围内的最大值。)
然后我尝试在电子表格的 where close 中运行这个完全相同的子选择。也就是说,我手动选择了相同的日期范围(作为变量正确且成功地传递),但我替换d1_10.xpid = d1_10_b.xpid
了d1_10_b.xpid = '2258'
. 这没有用。电子表格没有显示该患者的行,似乎是因为它在受子查询中的日期范围限制之前仍然应用了 MAX() 函数。然而,子查询在单独运行时有效。
非常感谢任何进一步的建议。