SQL query returns 在子查询中使用不同的结果

SQL query returns different results when it is used in subquery

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

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

查询 1:

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' 子查询对于两个查询是相同的。为了方便阅读,我只是删除了它。

如有任何见解,我们将不胜感激。

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

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

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

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

db<>fiddle

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