[英]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.