簡體   English   中英

SQL 查詢在子查詢中使用時返回不同的結果

[英]SQL query returns different results when it is used in subquery

我試圖理解為什么這兩個查詢返回不同的結果。 第一個查詢是第二個查詢的子查詢。 第一個查詢返回准確的結果,而第二個查詢則沒有。 我主要對ACH_CODEACH_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)

db<>小提琴

雖然,如果每個帳戶的快照日期都是唯一的,那么它總是會得到 null; 如果不是,結果仍然不確定,因為您沒有指定如何打破平局。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM