Sql 如何使用多个条件填充Lead窗口的空值

Sql 如何使用多个条件填充Lead窗口的空值,sql,sql-server,Sql,Sql Server,我有一张桌子 我换台了 -------------------------------------- ID stage createdon -------------------------------------- 1 Propsect 1-Jan 1 Qualify 15-Jan 1 Develop 25-Jan

我有一张桌子

我换台了

--------------------------------------
   ID         stage       createdon   
--------------------------------------
    1         Propsect    1-Jan        
    1         Qualify     15-Jan       
    1         Develop     25-Jan       
    2         Qualify     9-Feb       
    2         Develop     7-March     
    3         Prospect    9-April 
    3         Prospect    9-April  
如何在基于多个条件生成的新列中填充空值。 例:如果Opp赢/输,卖出交割日期 如果Opp是开放式的,请在今天提交日期

预期成果:

--------------------------------------
   OppID      Stage       createdon   newcolumn 
--------------------------------------
    1         Propsect    1-Jan        15-Jan
    1         Qualify     15-Jan       25-Jan 
    1         Develop     25-Jan       10-March ---(closedate for Wonn Opp1)
    2         Qualify     9-Feb        7-March
    2         Develop     7-March      11-june  ---(closedate for lost Opp2)
    3         Prospect    9-April      10-April
    3         Qualify     10-April     4/2/2017----(todaydate for Open Opp3)
使用此查询,将获得“打开”的实际关闭日期,但我想要今天的日期

Select *
      ,NewColumn = COALESCE(Lead(A.createdon) over (Partition By A.ID Order By A.CreatedOn),B.actualclosedate)

 From  stagechange A
 Join  OppTable B on A.ID=B.ID

您可以尝试以下查询:

WITH cte AS (
    SELECT a.ID, a.Stage, a.CreatedOn, b.CloseDate, b.Status,
           LEAD(a.CreatedOn) OVER (PARTITION BY a.ID ORDER BY a.CreatedOn) ld,
           ROW_NUMBER() OVER (PARTITION BY a.ID ORDER BY a.CreatedOn DESC) rn,
           DENSE_RANK() OVER (PARTITION BY a.ID ORDER BY a.CreatedOn DESC) dr
    FROM stagechange a
    INNER JOIN OppTable b
        ON a.ID = b.ID
)
SELECT t.ID, t.Stage, t.CreatedOn,
       CASE WHEN (t.rn <> 1 OR t.rn = t.dr) AND t.ld IS NOT NULL THEN t.ld
            WHEN t.Status <> 'Open' THEN t.CloseDate
            ELSE GETDATE()
        END AS newcolumn
FROM cte t
ORDER BY t.ID, t.CreatedOn;
我发现同时使用ROW_NUMBER和densite_RANK来处理一个给定ID可以有多个等效截止日期的边缘情况是必要的。在这种情况下,我们需要某种方法来确定哪一个是最老的

输出:

此处演示:


恐怕这个查询无法编译。什么是B.actualclosedate?如果您想在今天获得“打开”状态,可以在状态为“打开”时使用CASE,然后使用Current_Date ELSE B.actualclosedate END,而不是COALESCE内的B.actualclosedate。
WITH cte AS (
    SELECT a.ID, a.Stage, a.CreatedOn, b.CloseDate, b.Status,
           LEAD(a.CreatedOn) OVER (PARTITION BY a.ID ORDER BY a.CreatedOn) ld,
           ROW_NUMBER() OVER (PARTITION BY a.ID ORDER BY a.CreatedOn DESC) rn,
           DENSE_RANK() OVER (PARTITION BY a.ID ORDER BY a.CreatedOn DESC) dr
    FROM stagechange a
    INNER JOIN OppTable b
        ON a.ID = b.ID
)
SELECT t.ID, t.Stage, t.CreatedOn,
       CASE WHEN (t.rn <> 1 OR t.rn = t.dr) AND t.ld IS NOT NULL THEN t.ld
            WHEN t.Status <> 'Open' THEN t.CloseDate
            ELSE GETDATE()
        END AS newcolumn
FROM cte t
ORDER BY t.ID, t.CreatedOn;