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;