在date范围内select最大值

任务:

  • 附加/编辑下面的当前工作代码,以便每个患者只返回一行, d1_10.xtransfer (datatype int)的最大值,限制为该行的d1_10.dstartdate <= glob_End_Date

注意事项:

  • 在StackOverflow及其姊妹网站上也有类似的问题。 我没有发现已经成功地帮助解决了这个问题。

  • 这是一个医疗EHR数据库,我可以共享代码,但任何结果的讨论必须是一般的,并排除患者信息。

  • 我正在replace预先存在的Excel电子表格中的SQL查询来做一些不同的事情。 Excel使用ODBC连接从我们的数据库中获取信息。 我们的数据库使用的是Ingres SQL,它接受大多数(但不是全部)典型的SQL代码types。 有可能一段代码通常在其他types的SQL中工作,但不能与Ingres和Excel的组合工作。 我已经得到了电子表格的工作和返回结果,现在是通过编写在这个软件中运行的SQL代码来做一些修复。

迄今:

使用下面的当前工作代码(没有最大的d1_10.xtransfer限制),我们返回用户select的date范围内的所有行,并且用户select了d1_10.xinstitute 。 我们只想要最新的一个。 也就是说,病人的行在date范围内的最大值d1_10.xtransfer ,或date范围内的最大值d1_10.xtransfer (添加后的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)

有了这个额外的行,我们现在只返回每个在date范围内有d1_10.xtransfer患者的一行。 但是,如果他们有一个d1_10.xtransfer比date范围更新的行,那么他们根本不会显示在结果中。

使用这一行代码在应用date限制之前为每个xpid使用MAX(d1_10.xtransfer) 。 按照我的逻辑,我们希望它能够这样做,但是我一直无法想出运行它的代码。

提前致谢。 我会保持这个问题更新与此分页符下面的其他信息。


附加信息:

  • Per 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') "

6月14日和17日,患者鲍勃已经接受了符合其他标准的转移。

input结束date为Jun 17+的date范围时,电子表格会正确地为他的Jun 17传输返回一行Bob。

input结束date为Jun 14,15或16的date范围时,电子表格错误地不会为Bob返回一行。

看来好像它仍然需要最大限度的xtransfer限制date之前。

  • Per PaulM的评论:

我按照以下步骤为特定患者运行了子查询:

input:

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设置d1_10_b.xpid等于特定患者,它会正确地从date范围中提取最大x传输。 (在date范围之外还有一个更新的xtransfer ,它仍然正确地显示了date范围内的最大xtransfer 。)

然后我尝试在电子表格的哪个closures处运行完全相同的子查询。 也就是说,我手动select了相同的date范围(这是正确和成功地通过作为variables),但我d1_10.xpid = d1_10_b.xpid d1_10_b.xpid = '2258' d1_10.xpid = d1_10_b.xpid了。 这没有奏效 。 电子表格没有显示这个病人的行,看起来是因为在它受限于子查询中的date范围之前,它仍然应用MAX()函数。 然而,子查询本身运行。

非常感谢任何进一步的build议。

您需要在子查询中添加date限制以及主查询。 另外我怀疑这个小组是错误的。 通过添加一个小组,您可以为每个xpid(识别患者)提供一个最大值的患者列表xtransfer值。 但是,这意味着如果您从主查询中感兴趣的行恰好具有与属于不同的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} )