Select 日期范围内的最大值

Select a maximum value within a date range

任务:

注意事项:

到目前为止:

使用下面的当前工作代码(没有最大 d1_10.xtransfer 限制)我们 return 在用户选择的日期 运行ge 中具有 d1_10.dstartdate 的所有行和用户已选择 d1_10.xinstitute。我们只想要最新的。也就是说,患者的行在日期 运行ge 内具有最大值 d1_10.dstartdate,或者在日期 运行 内具有最大值 d1_10.xtransfer(索引在添加时向上计数) ]ge.

当前工作代码:

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

有了这条额外的线,我们现在 return 每个在 运行ge 日期内有 d1_10.xtransfer 的患者只有一行。 但是 如果他们有一行 d1_10.xtransfer 比日期 运行ge 更新,那么他们根本不会出现在结果中。

在这一行中,代码在应用日期限制之前为每个 xpid 使用 MAX(d1_10.xtransfer)。按照我的逻辑,我们希望它在之后这样做,但我一直无法想出 运行 比这更接近它的代码。

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


附加信息:

是的,xpid是患者ID索引号,对每个患者都是唯一的。

WHERE 子句中的

Added/edited 行:"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 日有 t运行 次转诊符合其余标准。

输入结束日期为 6 月 17 日后的日期 运行ge 时,电子表格正确地return为 Bob 和他的 6 月 17 日 运行sfer 排了一行。

输入结束日期为 Jun 14,15 或 16 的日期 运行ge 时,电子表格错误地没有 return Bob 的一行。

似乎在按日期限制之前仍需要最大 xt运行sfer。

我运行 特定患者的子选择如下:

输入:

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 设置为特定患者,它正确地从中提取最大 xt运行sfer日期 运行ge。 (在日期 运行ge 之外有一个更近的 xtransfer,它仍然正确显示日期 运行ge 内的最大值 xtransfer。)

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

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

您需要在子查询和主查询中添加日期限制。我也怀疑 group by 是错误的。通过添加一个组,您可以使子选择成为患者 xtransfer 值的列表,每个 xpid 具有最大值(识别患者?)。然而,这意味着如果您从主查询中感兴趣的行恰好有一个 xtransfer 值与属于不同 xpid 的最大一个相匹配,您就会得到一个错误的匹配。

您真正需要的是在 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} )