Sql 如何在另一列中获取下一行值
我有一张桌子叫Opp桌Sql 如何在另一列中获取下一行值,sql,sql-server,tsql,ssms,Sql,Sql Server,Tsql,Ssms,我有一张桌子叫Opp桌 -------------------------------------- OppID Stage createdon newcolumn -------------------------------------- 1 Propsect 1-Jan 15-Jan 1 Qualify 15-Jan 25-Jan 1 Dev
--------------------------------------
OppID Stage createdon newcolumn
--------------------------------------
1 Propsect 1-Jan 15-Jan
1 Qualify 15-Jan 25-Jan
1 Develop 25-Jan 9-Feb
1 Qualify 9-Feb 7-March
1 Develop 7-March 9-April
1 Prospect 9-April 10-March ----(actualclosedate)
我有一张叫stagechange的桌子
--------------------------------------
OppID Stage createdon
--------------------------------------
1 Propsect 1-Jan
1 Qualify 15-Jan
1 Develop 25-Jan
1 Qualify 9-Feb
1 Develop 7-March
1 Prospect 9-April
如何创建新列并获取createdon列中的下一行值;有这样的东西。如果没有更多的next值,我们将从其他表中获取日期,如Opp表中的实际结束日期
--------------------------------------
OppID Stage createdon newcolumn
--------------------------------------
1 Propsect 1-Jan 15-Jan
1 Qualify 15-Jan 25-Jan
1 Develop 25-Jan 9-Feb
1 Qualify 9-Feb 7-March
1 Develop 7-March 9-April
1 Prospect 9-April 10-March ----(actualclosedate)
假设
createdOn
存储为有效的日期/时间类型,并且“下一步”是指本列中的“下一步”,那么只需使用lead()
:
这假设(尽管问题中没有明确说明)您希望根据OppId
获得下一个日期
lead()
是大多数(但不是所有)数据库中可用的ANSI标准函数。这将用实际关闭日期替换最终/缺失的日期
Select A.*
,NewColumn = IsNull(Lead(creaton) over (Partition By A.OppID Order By A.CreateOn),B.actualclosedate)
From stagechange A
Join Opp B on A.OppID=B.OppID
您可以使用COALESCE功能createdon列的类型是什么?请使用您正在使用的数据库进行标记。提示:使用适当的软件(MySQL、Oracle、DB2等)和版本(例如,
sql-server-2014
)标记数据库问题很有帮助。语法和特征的差异通常会影响答案。
Select A.*
,NewColumn = IsNull(Lead(creaton) over (Partition By A.OppID Order By A.CreateOn),B.actualclosedate)
From stagechange A
Join Opp B on A.OppID=B.OppID