[英]SQL query returns different results when it is used in subquery
我試圖理解為什么這兩個查詢返回不同的結果。 第一個查詢是第二個查詢的子查詢。 第一個查詢返回准確的結果,而第二個查詢則沒有。 我主要對ACH_CODE
和ACH_PRIOR
標識符感興趣。
第一個查詢分別返回 0 和null
而第二個返回 0 和 1。這是一個大問題,因為我最終想要 select 帳戶對於一個或其他標識符大於 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()
僅對與提供的帳號匹配的行進行操作。 該帳戶的表中沒有前一行(與子查詢中的日期匹配),因此滯后獲取 null。
在第二個查詢中,它對所有帳戶進行操作。 該帳戶仍然沒有上一行; 但是另一個帳戶有一個(與日期匹配)。 在評估滯后后應用帳號過濾器。 (您獲得的值是不確定的 - 它可能適用於任何其他帳戶,或 null,因為您只在延遲調用中按日期訂購。)
您可以添加分區子句以將其限制為來自同一帳戶的行:
LAG(ACH_CODE, 1) OVER (PARTITION BY ACCOUNT_NUMBER ORDER BY SNAPSHOT_DATE)
雖然,如果每個帳戶的快照日期都是唯一的,那么它總是會得到 null; 如果不是,結果仍然不確定,因為您沒有指定如何打破平局。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.