sql - SQL查询在子查询中使用时返回不同的结果
问题描述
我试图理解为什么这两个查询返回不同的结果。第一个查询是第二个查询的子查询。第一个查询返回准确的结果,而第二个查询则没有。我主要对ACH_CODE
和ACH_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'
两个查询的子查询相同。为了便于阅读,我只是将其删除。
任何见解将不胜感激。
解决方案
在您的第一个查询中,lag()
仅对与提供的帐号匹配的行进行操作。该帐户的表中没有前一行(与子查询中的日期匹配),因此 lag 为空。
在第二个查询中,它对所有帐户进行操作。该帐户仍然没有上一行;但是另一个帐户有一个(与日期匹配)。在评估滞后后应用帐号过滤器。(您获得的值是不确定的 - 它可能是任何其他帐户,也可能是 null,因为您只在延迟调用中按日期排序。)
您可以添加分区子句以将其限制为来自同一帐户的行:
LAG(ACH_CODE, 1) OVER (PARTITION BY ACCOUNT_NUMBER ORDER BY SNAPSHOT_DATE)
虽然,如果每个帐户的快照日期都是唯一的,那么它将始终为空;如果不是,结果仍然不确定,因为您没有指定如何打破平局。
推荐阅读
- reactjs - 带有反应路由器 v4 的嵌套路由不起作用
- java - 如何爬取或者如何使用JSOUP和java从一个URL中获取所有元素,先登录页面,登录后爬取页面
- assembly - ASM 4 位乘 4 位软件乘法
- bluetooth - 在 Android 手机中获取支持的蓝牙版本?(5 或 4.x)
- ruby - 如何找到重复的哈希数组并在 Ruby 中打印它们
- java - Java 8 基于正则表达式从数组/数组列表中删除一个项目
- java - 在 64 位 Windows 上找不到 PKCS#11 库
- python - 气流任务取决于另一个任务结果?
- gulp - gulp init 要求进行本地安装,但我有 CLI 版本
- tensorflow - 为什么我在 TensorFlow Keras 中的损失函数和指标之间得到不同的值?