首页 > 解决方案 > SQL查询在子查询中使用时返回不同的结果

问题描述

我试图理解为什么这两个查询返回不同的结果。第一个查询是第二个查询的子查询。第一个查询返回准确的结果,而第二个查询则没有。我主要对ACH_CODEACH_PRIOR标识符感兴趣。

第一个查询null分别返回 0 和 ,而第二个查询分别返回 0 和 1。这是一个大问题,因为我最终想为一个或另一个标识符选择大于 0 的帐户。我已经仔细检查了系统,该帐户不应该在我的人口中,但最终会与其他类似帐户一起出现在人口中。

查询一:

SELECT 
    ACCOUNT_NUMBER, MATURITY_DATE, SNAPSHOT_DATE, ACH_CODE, 
    LAG(ACH_CODE, 1) OVER(ORDER BY SNAPSHOT_DATE) AS ACH_PRIOR
FROM 
    PORTFOLIO T1
WHERE 
    SNAPSHOT_DATE = (DATE*)
    AND ACCOUNT_NUMBER = 81925169

查询 2:

SELECT 
    ACCOUNT_NUMBER, MATURITY_DATE, SNAPSHOT_DATE, ACH_CODE, ACH_PRIOR 
FROM 
    (SELECT 
         ACCOUNT_NUMBER, MATURITY_DATE, SNAPSHOT_DATE, ACH_CODE, 
         LAG(ACH_CODE, 1) OVER(ORDER BY SNAPSHOT_DATE) AS ACH_PRIOR
     FROM 
         PORTFOLIO T1
     WHERE 
         SNAPSHOT_DATE = (DATE*))
WHERE  
    ACCOUNT_NUMBER = 81925169

查询中的'DATE'实际是另一个子查询,它为每个帐号定义了一个特定的日期。'DATE'两个查询的子查询相同。为了便于阅读,我只是将其删除。

任何见解将不胜感激。

标签: sqloracle-sqldeveloper

解决方案


在您的第一个查询中,lag()仅对与提供的帐号匹配的行进行操作。该帐户的表中没有前一行(与子查询中的日期匹配),因此 lag 为空。

在第二个查询中,它对所有帐户进行操作。帐户仍然没有上一行;但是另一个帐户有一个(与日期匹配)。在评估滞后后应用帐号过滤器。(您获得的值是不确定的 - 它可能是任何其他帐户,也可能是 null,因为您只在延迟调用中按日期排序。)

您可以添加分区子句以将其限制为来自同一帐户的行:

LAG(ACH_CODE, 1) OVER (PARTITION BY ACCOUNT_NUMBER ORDER BY SNAPSHOT_DATE)

db<>小提琴

虽然,如果每个帐户的快照日期都是唯一的,那么它将始终为空;如果不是,结果仍然不确定,因为您没有指定如何打破平局。


推荐阅读