如何解决SQL Server:添加结束日期的计算列
我有一个不断更新的数据集,其日期值如下所示:
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
基本上,该表由零件号以及其各自的状态和生命周期日期组成。
然后,我利用CROSS APPLY
将不同相位的列转置为一列。这是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
列中的值。 EndDate
将与下一阶段的Date
相同。这是该视图的前六行,以作为其外观的示例:
StartDate
如您所见,“注册启动” 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
。
处理此问题的最佳方法是什么?我应该在转置之前还是之后创建一个计算列?这只是一个摘要,像这样有成千上万的数据行,所以我想优化代码。
解决方法
我认为您想要 <servers>
<server>
<id>central</id>
<username>ARTIFACTORY_USERNAME</username>
<password>ARTIFACTORY_API_KEY</password>
</server>
<server>
<id>snapshots</id>
<username>ARTIFACTORY_USERNAME</username>
<password>ARTIFACTORY_API_KEY</password>
</server>
</servers>
:
lead()
编辑:
如果要使用默认值,请使用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);
的3个参数形式:
LEAD()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。