SQL query returns 在子查询中使用不同的结果
SQL query returns different results when it is used in subquery
我想了解为什么这两个查询返回不同的结果。第一个查询是第二个查询中的子查询。第一个查询返回准确的结果,而第二个查询则没有。我主要对 ACH_CODE
和 ACH_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)
尽管如此,如果每个帐户的快照日期都是唯一的,那么它将始终为空;如果不是,结果仍然不确定,因为您没有指定如何打破平局。
我想了解为什么这两个查询返回不同的结果。第一个查询是第二个查询中的子查询。第一个查询返回准确的结果,而第二个查询则没有。我主要对 ACH_CODE
和 ACH_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)
尽管如此,如果每个帐户的快照日期都是唯一的,那么它将始终为空;如果不是,结果仍然不确定,因为您没有指定如何打破平局。