SQL Server:为结束日期添加计算列
我有一个数据集,该数据集不断更新,日期值如下所示:SQL Server:为结束日期添加计算列,sql,sql-server,tsql,datetime,calculated-columns,Sql,Sql Server,Tsql,Datetime,Calculated Columns,我有一个数据集,该数据集不断更新,日期值如下所示: Part Number Product Status Phase1 Phase2 Phase3 Phase4 Phase5 Phase6 FD 2000 Maintain 2020-01-03 00:00:00.000 2020-01-08 00:00:00.000 2020-01-15 00:00:00.000 2020-01-17 00:00:00.000 2020-01-22 00:00:00.000 2020-01-3
Part Number Product Status Phase1 Phase2 Phase3 Phase4 Phase5 Phase6
FD 2000 Maintain 2020-01-03 00:00:00.000 2020-01-08 00:00:00.000 2020-01-15 00:00:00.000 2020-01-17 00:00:00.000 2020-01-22 00:00:00.000 2020-01-31 00:00:00.000
FD 2001 Maintain 2020-01-03 00:00:00.000 2020-01-08 00:00:00.000 2020-01-15 00:00:00.000 2020-01-17 00:00:00.000 2020-01-22 00:00:00.000 2020-01-31 00:00:00.000
基本上,该表由零件号及其各自的状态和生命周期日期组成
然后,我利用交叉应用
将不同的相位列转换为一列。以下是SQL语法:
SELECT [Part Number], [Product Status], Phase, Date
FROM PLCMexample
CROSS APPLY (VALUES ('Phase1', [Phase1]),
('Phase2', [Phase2]),
('Phase3', [Phase3]),
('Phase4', [Phase4]),
('Phase5', [Phase5]),
('Phase6', [Phase6]))
CrossApplied (Phase, Date)
GO
这将生成以下视图:
Part Number Product Status Phase Date
FD 2000 Maintain Registration Initiation 2020-01-03 00:00:00.000
FD 2000 Maintain Product Launch 2020-01-08 00:00:00.000
FD 2000 Maintain Phase Out 2020-01-15 00:00:00.000
FD 2000 Maintain Last Order 2020-01-17 00:00:00.000
FD 2000 Maintain Last Shipment 2020-01-22 00:00:00.000
FD 2000 Maintain Last Service 2020-01-31 00:00:00.000
FD 2001 Maintain Registration Initiation 2020-01-03 00:00:00.000
FD 2001 Maintain Product Launch 2020-01-08 00:00:00.000
FD 2001 Maintain Phase Out 2020-01-15 00:00:00.000
FD 2001 Maintain Last Order 2020-01-17 00:00:00.000
FD 2001 Maintain Last Shipment 2020-01-22 00:00:00.000
FD 2001 Maintain Last Service 2020-01-31 00:00:00.000
这很好,但现在我不仅需要视图的Date
列,还需要StartDate
和EndDate
。StartDate
将是当前Date
列中的值。结束日期
将与下一阶段的开始日期
相同。以下是视图的前六行,作为其外观示例:
Part Number Product Status Phase StartDate EndDate
FD 2000 Maintain Registration Initiation 2020-01-03 00:00:00.000 2020-01-08 00:00:00.000
FD 2000 Maintain Product Launch 2020-01-08 00:00:00.000 2020-01-15 00:00:00.000
FD 2000 Maintain Phase Out 2020-01-15 00:00:00.000 2020-01-17 00:00:00.000
FD 2000 Maintain Last Order 2020-01-17 00:00:00.000 2020-01-22 00:00:00.000
FD 2000 Maintain Last Shipment 2020-01-22 00:00:00.000 2020-01-31 00:00:00.000
FD 2000 Maintain Last Service 2020-01-31 00:00:00.000 2020-01-31 00:00:00.000
如您所见,“注册启动”EndDate
与“产品发布”的StartDate
相同。最后一个阶段“最后一次服务”将具有相同的StartDate
和EndDate
最好的处理方法是什么?我应该在换位之前还是之后创建计算列?这只是一个片段,有数千行这样的数据,因此我想优化代码。我想您需要
lead()
:
编辑:
如果需要默认值,请使用三参数形式的LEAD()
:
这太棒了!它运行得很好。唯一的警告是最后阶段。因为接下来没有任何内容,所以它在该列中放置NULL。是否可以将该结束日期设置为开始日期后的一段时间?@sykfarhan
ISNULL(提前期(日期)超过(按日期[零件号]顺序划分),DATEADD(日期,您想要的编号,日期))作为下一个日期
您可以这样做,我建议将数据类型更改为日期,因为看起来您没有使用DATETIME(DATETIME2)的time元素。它会让它更干净。
SELECT [Part Number], [Product Status], Phase, Date,
LEAD(Date) OVER (PARTITION BY [Part Number] ORDER BY Date) as Next_Date
FROM PLCMexample CROSS APPLY
(VALUES ('Phase1', [Phase1]),
('Phase2', [Phase2]),
('Phase3', [Phase3]),
('Phase4', [Phase4]),
('Phase5', [Phase5]),
('Phase6', [Phase6])
) CrossApplied (Phase, Date);
LEAD(Date, 1, DATEADD(DAY, 100, DATE) OVER (PARTITION BY [Part Number] ORDER BY Date) as Next_Date