簡體   English   中英

SQL Teradata 時的嵌套案例

[英]Nested Case when SQL Teradata

請我有以下數據,我需要計算每個 ID 的 Current_date 和 Max Date 之間的日期差異,僅用於Active狀態,日期差異的結果將位於最大日期旁邊,其他記錄返回 NULL。

|ID  |Date  |Status   |
|----+------|---------|
|A   |1-Apr |Active   |
|A   |15-Apr|Active   |
|B   |1-Mar |Suspended|
|B   |15-Mar|Deactive |
|C   |1-Jan |Active   |
|C   |15-Jan|Active   |

我嘗試使用以下查詢,但它與每個日期重復結果

SELECT
    ID,
    Date, 
    CASE WHEN STATUS = 'Active' THEN
    CASE WHEN Date = MAX(Date) OVER (PARTITION BY ID)
         THEN CURRENT_DATE - MAX(Date) OVER (PARTITION BY ID) ELSE NULL END
ELSE NULL END AS Duration
FROM cte
ORDER BY ID, Date;

但我需要結果如下

|ID  |Date  |Status   |Duration|
|----+------|---------|--------|
|A   |1-Apr |Active   |NULL    |
|A   |15-Apr|Active   |19      |
|B   |1-Mar |Suspended|NULL    |
|B   |15-Mar|Deactive |NULL    |
|C   |1-Jan |Active   |NULL    |
|C   |15-Jan|Active   |109     |

如果您只想在帶有“ACTIVE”的最新行上使用它,請添加row_number()

SELECT ID, Date, 
       (CASE WHEN STATUS = 'Active' AND
                  ROW_NUMBER() OVER (PARTITION BY ID ORDER BY DATE DESC) = 1
             THEN CURRENT_DATE - Date
        END) as Duration
FROM cte
ORDER BY ID, Date;

請注意,您的代碼看起來應該可以工作,除非id有重復的最近日期。 然而,這個版本更簡單一些,避免了嵌套的CASE表達式和對MAX()的不必要的第二次調用。

SELECT ID,
       DATE,
       Status,
       CASE
         WHEN STATUS = 'Active' AND RNUM = 1 THEN CURRENT_DATE - DATE
         ELSE NULL
       END AS Duration
FROM (SELECT ID,
             DATE,
             Status,
             ROW_NUMBER() OVER (PARTITION BY ID,Status ORDER BY DATE DESC) AS RNUM
      FROM CTE) CTE2
ORDER BY ID,
         DATE;

暫無
暫無

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

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