0

任务:

  • 附加/编辑下面当前工作的代码,以仅返回每个患者一行, (datatype int)的最大值d1_10.xtransferd1_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.xpidd1_10_b.xpid = '2258'. 这没有用。电子表格没有显示该患者的行,似乎是因为它在受子查询中的日期范围限制之前仍然应用了 MAX() 函数。然而,子查询在单独运行时有效。

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

4

1 回答 1

1

您需要在子查询和主查询中添加日期限制。我也怀疑 group by 是错误的。通过添加一个组,您将子选择一个患者 xtransfer 值列表,其中每个 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} )
于 2016-07-07T14:49:30.570 回答