选择日期范围内的最大值

时间:2016-07-07 13:47:46

标签: sql excel excel-vba odbc ingres vba

任务:

  • 将以下当前正在运行的代码附加/编辑为 每位患者只返回一行,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)。根据我的逻辑,我们希望它在相反之后这样做,但我无法提出运行的代码,使其比这更接近。

提前致谢。我将在此分页符下方的其他信息中更新此问题。

其他信息:

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

患者Bob在6月14日和17日都有转移,符合其他标准。

当输入结束日期为Jun 17+的日期范围时,电子表格会正确地为Bob返回他的Jun 17转移行。

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

似乎在按日期限制之前仍然需要最大的xtransfer。

  • Per 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。)

然后我尝试在电子表格的关闭位置运行这个完全相同的子选择。也就是说,我手动选择了相同的日期范围(正确且成功地将其作为变量传递),但我为d1_10.xpid = d1_10_b.xpid提供了d1_10_b.xpid = '2258'这不起作用。电子表格没有显示该患者的行,似乎是因为它在应用子查询中的日期范围之前仍然应用MAX()函数。然而,子查询在单独运行时起作用。

对任何进一步的建议表示赞赏。

1 个答案:

答案 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} )